Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/matlab/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Matlab 将随机数添加到矩阵的单元格中_Matlab_Random_Cell_Flow - Fatal编程技术网

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