将随机数添加到矩阵的单元格中

时间:2015-08-03 15:08:21

标签: matlab random cell flow

我有一个大小为1乘625的单元格A。即

A = { A1, A2, ..., A625}

其中单元格A的625个元素中的每一个都是相同大小的3D矩阵,42乘42乘3。

问题1

由于我的矩阵条目代表的红细胞浓度非常小,我不能简单地使用randn

对于每个矩阵,我尝试使用此命令,例如:

A1 = A1 .*(1 + randn(42,42,3)/100)

我尝试用100除以最小化非常负数的可能性(例如1.234e-6),但我无法消除这种可能性。

此外,是否有任何快速方法可以将不同的randn(42,42,3)添加到不同的625矩阵中。 A + randn(42,42,3)无效,因为它添加了相同的随机数。

问题2

我希望通过向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

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

2 个答案:

答案 0 :(得分:1)

关于你的第一个问题,

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

你的第二个问题应该是(A)是第二个问题,(B)一旦你的第一个问题完成就可以解决。只需删除Patients +,您的代码就可以正常运行。

答案 1 :(得分:1)

问题1:

% 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)

请注意&randn' randn',' rng'

来自MATLAB文档的

  

rng(' shuffle')根据当前时间为随机数生成器播种。因此,每次调用rng后,rand,randi和randn会产生不同的数字序列。

rand =均匀分布的随机数 - >没有负值[0,1]

randn =正态分布的随机数

如果要在特殊时间间隔内生成数字(来自MATLAB文档)

  

通常,您可以在区间[a,b]中生成N个随机数,其公式为r = a +(b-a)。* rand(N,1)。

问题2:

我强烈建议您使用30个单元构建一个结构。这将有助于以后显着的索引/循环!您可以在患者之后命名结构字段,这样您就可以更轻松地跟踪它们。

您还可以构建一个单元阵列。这是索引的最简单方法。

在这两种情况下:做memmory的预分配! (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个矩阵也可能适合你。数据结构会显着影响性能,可读性和编码时间!