Matlab 将随机数添加到矩阵的单元格中
我有一个单元格,Matlab 将随机数添加到矩阵的单元格中,matlab,random,cell,flow,Matlab,Random,Cell,Flow,我有一个单元格,a,大小为1乘625。i、 e A={A1,A2,…,A625}, 其中,单元格A的625个元素中的每一个都是相同大小的3D矩阵,42×42×3 问题1 因为我的矩阵中的条目代表了红细胞的浓度,这些红细胞的值非常小,我不能简单地使用randn 对于每个矩阵,我尝试使用以下命令,例如: A1=A1.*(1+randn(42,42,3)/100) 我尝试除以100,以最小化非常负数的可能性(例如1.234e-6),但我无法消除这种可能性 此外,是否有任何快速方法可以将不同的rand
a
,大小为1乘625。i、 e
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
。也就是说,我想得到一个单元格,病人
,它是一个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)一旦你的第一个问题解决了,就很容易解决了。只要放下
患者+
,您的代码就会正常工作。问题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)
注意“rand”、“randn”、“rng”之间的区别
从MATLAB文档中:
rng(“shuffle”)根据当前时间为随机数生成器种子。因此,每次调用rng后,rand、randi和randn都会生成不同的数字序列
rand=均匀分布的随机数->无负值[0,1]
randn=正态分布随机数
如果要在特殊间隔内生成数字(来自MATLAB文档):
通常,您可以使用公式r=a+(b-a)在区间[a,b]中生成N个随机数
问题2:
我强烈建议您使用30个单元格构建一个结构。这将大大促进以后的索引/循环!您可以以患者的名字命名结构字段,这样您跟踪患者的麻烦就少了
还可以构建单元阵列。这是索引的最简单方法
在这两种情况下:执行内存的预分配!(MATLAB将变量存储在内存中。如果变量增长,MATLAB可能需要重新定位变量…)
如果您喜欢阵列:
% preallocation:
arry = cell(30);
for i = 1:length(array)
arry(i) = { cellfun( @(x) rand(42,42,3), A ,'UniformOutput', false) };
end
这是一个很大的索引问题,如果使用()、{}和[]进行索引,您会遇到很多麻烦
如果您首先需要一个单元格数组,请再考虑一下。625个矩阵的数组可能也适合您。数据结构会显著影响性能、可读性和编码时间 我尝试了类似的简单问题:
A=reformate([1:9],3,3)代码>,B=重塑([1:9],3,3)代码>,C={A,B}代码>和D=cellfun(@(x)(x+randn(3,3)/100),C)
。它在统一输出中返回非标量,索引为1,输出为1。将“UniformOutput”设置为false。对,忘了这一点。但这几乎是最明显的错误。请参阅编辑(或谷歌),再次感谢。它的工作原理是添加条目式随机数。我试过很多次,如果我除以100,产生的随机数不会太负。但事实上,由于现实情况,我打算将其除以10。只是想知道我们能不能让它永远不为负,但随机数的分布仍然是正态的?@nam这是不可能的,如果负数是你的主要问题,那么也许你应该使用对数正态分布。再次感谢。使用对数正态分布的建议很好。感谢您对编程的建议,我现在尝试在代码中采用它。一些注释,rand
和randn
在概念上完全不同。OP需要确保均匀分布是可接受的。其次,您的匿名函数应该是`@(x)x+rand(42,42,3)`否则,您只会创建噪声并完全丢弃原始信息,而不是向图像添加噪声。
% preallocation:
arry = cell(30);
for i = 1:length(array)
arry(i) = { cellfun( @(x) rand(42,42,3), A ,'UniformOutput', false) };
end