matlab 向矩阵的单元格添加随机数

ljo96ir5  于 2023-06-30  发布在  Matlab
关注(0)|答案(2)|浏览(214)

我有一个单元格A,大小为1 x 625。即
A = { A1, A2, ..., A625}
其中单元A的625个元素中的每一个都是相同大小的3D矩阵,42乘42乘3。

问题一

由于我的矩阵的条目表示红细胞的浓度,这些值非常小,我不能简单地使用randn
对于每个矩阵,我尝试使用此命令,例如:
A1 = A1 .*(1 + randn(42,42,3)/100)
我试着除以100来最小化非常负数的可能性(例如1.234e-6),但我不能排除这种可能性。
还有,有没有什么快速的方法可以将不同的randn(42,42,3)添加到不同的625矩阵中。A + randn(42,42,3)不起作用,因为它添加的是同一组随机数。

问题二

我想通过向625个矩阵的每个条目添加随机数来制作30个单元格A的副本。也就是说,我想得到一个单元,Patients,它是一个1乘30的单元,每个单元元素是625个矩阵的另一个单元元素。

Patients = A % Initialization. I have 30 patients.

for i = 1 : 30;
   Patients = { Patients, Patients + `method from problem 1`};
end

我试图把我的问题说清楚。我非常感谢你的帮助。

ix0qys7i

ix0qys7i1#

问题一:

% optional: initialize the random number generator to the current time. T
rng('shuffle');
A = cell(625);
A = cellfun( @(x) rand(42,42,3), A ,'UniformOutput', false)

注意'rand','randn','rng'之间的区别

  • 来自MATLAB文档:*

rng('shuffle')基于当前时间为随机数生成器提供种子。因此,兰德、randi和randn在您每次调用rng之后都会产生不同的数字序列。
兰德=均匀分布的随机数->无负值[0,1]
randn =正态分布随机数
如果你想在一个特殊的时间间隔内生成数字 (来自MATLAB文档)
一般来说,你可以用公式r = a +(b-a).*rand(N,1)在区间[a,b]中生成N个随机数。

问题二:

我强烈建议你用你的30个单元格构建一个结构体。这将极大地促进后面的索引/循环!您可以用患者的名字来命名结构体字段,这样跟踪它们就不那么麻烦了。
您也可以创建一个单元阵列。这是最简单的索引方式。
在这两种情况下:做内存的预分配!* (MATLAB在内存中一致地存储变量。如果变量变大,MATLAB可能必须重新定位变量...)*

% for preallocation + initialization in one step:
A = cell(625);
Patients.Peter = cellfun( @(x) rand(42,42,3), A ,'UniformOutput', false);
Patients.Tom = cellfun( @(x) rand(42,42,3), A ,'UniformOutput', false);

% loop through the struct like this
FldNms = fieldnames( Patients );
for i = 0:length(Patients)
     Patients.(FldNms{i}) = % do whatever you like
end

如果您更喜欢数组:

% preallocation:
arry = cell(30);
for i = 1:length(array)
     arry(i) = { cellfun( @(x) rand(42,42,3), A ,'UniformOutput', false) };
end

这是一个很大的野生索引,你会得到很多麻烦,使用(),{}和[]索引。
如果您首先需要一个单元阵列,请再考虑一下。625个矩阵的数组可能也适合您。数据结构可以显著影响性能、可读性和编码时间!

k97glaaz

k97glaaz2#

你的第一个问题

cellfun(@(x)(x + randn(42,42,3)/100), A, 'uni', 0)

你的第二个问题应该(A)是第二个问题,并且(B)一旦你的第一个问题解决了,就应该是微不足道的。只需删除Patients +,您的代码就可以正常工作。

相关问题