将随机数添加到矩阵的单元格
Add random number to cell of matrices
我有一个单元格,A
大小为 1 x 625。即
A = { A1, A2, ..., A625}
,
其中单元格 A
的 625 个元素中的每一个都是相同大小的 3D 矩阵,42 x 42 x 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 个矩阵的每个条目添加随机数来制作单元格 A
的 30 个副本。也就是说,我想获得一个单元格,Patients
,它是一个 1×30 的单元格,每个单元格元素是 625 个矩阵的另一个单元格元素。
Patients = A % Initialization. I have 30 patients.
for i = 1 : 30;
Patients = { Patients, Patients + `method from problem 1`};
end
我已经尽力把我的问题说清楚了。非常感谢您的帮助。
第一个问题,
cellfun(@(x)(x + randn(42,42,3)/100), A, 'uni', 0)
你的第二个问题应该 (A) 是第二个问题,并且 (B) 在你的第一个问题完成后很容易解决。只需删除 Patients +
,您的代码就会正常工作。
问题一:
% 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') seeds the random number generator based on the current time. Thus, rand, randi, and randn produce a different sequence of numbers after each time you call rng.
rand = 均匀分布的随机数 -> 无负值 [0, 1]
randn = 正态分布的随机数
如果要生成特殊区间的数字(来自MATLAB文档):
In general, you can generate N random numbers in the interval [a,b] with the formula r = a + (b-a).*rand(N,1).
问题二:
我强烈建议您使用 30 个单元构建一个结构。这样indexing/looping以后会方便很多!您可以以患者的名字命名结构字段,这样您就可以更轻松地跟踪它们。
您还可以构建元胞数组。这是最简单的索引方式。
在这两种情况下:进行内存预分配! (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 个矩阵的数组也可能适合您。数据结构会显着影响性能、可读性和编码时间!
我有一个单元格,A
大小为 1 x 625。即
A = { A1, A2, ..., A625}
,
其中单元格 A
的 625 个元素中的每一个都是相同大小的 3D 矩阵,42 x 42 x 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 个矩阵的每个条目添加随机数来制作单元格 A
的 30 个副本。也就是说,我想获得一个单元格,Patients
,它是一个 1×30 的单元格,每个单元格元素是 625 个矩阵的另一个单元格元素。
Patients = A % Initialization. I have 30 patients.
for i = 1 : 30;
Patients = { Patients, Patients + `method from problem 1`};
end
我已经尽力把我的问题说清楚了。非常感谢您的帮助。
第一个问题,
cellfun(@(x)(x + randn(42,42,3)/100), A, 'uni', 0)
你的第二个问题应该 (A) 是第二个问题,并且 (B) 在你的第一个问题完成后很容易解决。只需删除 Patients +
,您的代码就会正常工作。
问题一:
% 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') seeds the random number generator based on the current time. Thus, rand, randi, and randn produce a different sequence of numbers after each time you call rng.
rand = 均匀分布的随机数 -> 无负值 [0, 1]
randn = 正态分布的随机数
如果要生成特殊区间的数字(来自MATLAB文档):
In general, you can generate N random numbers in the interval [a,b] with the formula r = a + (b-a).*rand(N,1).
问题二:
我强烈建议您使用 30 个单元构建一个结构。这样indexing/looping以后会方便很多!您可以以患者的名字命名结构字段,这样您就可以更轻松地跟踪它们。
您还可以构建元胞数组。这是最简单的索引方式。
在这两种情况下:进行内存预分配! (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 个矩阵的数组也可能适合您。数据结构会显着影响性能、可读性和编码时间!