Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/loops/2.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_Loops - Fatal编程技术网

寻找一种在matlab中使用非循环法进行计算的方法

寻找一种在matlab中使用非循环法进行计算的方法,matlab,loops,Matlab,Loops,我正在将一个c程序移植到matlab中,以模拟一些数学问题。我用matlab重写了所有的代码,但是我发现在一个循环中花费了太多的时间。我不知道是否有更好的方法来计算以下内容,而不是使用for语句 我在一个结构中定义了大约1000个矩阵(所有的维度都相同) A{1}=matrix1 A{2}=matrix2 ... A{1000}=matrix1000 B是与a{n}维数相同的常数矩阵 我想计算A{n}和B的逐元素乘积,并将所有结果元素的总和返回到 for k=1:1000 AllSum(k)

我正在将一个c程序移植到matlab中,以模拟一些数学问题。我用matlab重写了所有的代码,但是我发现在一个循环中花费了太多的时间。我不知道是否有更好的方法来计算以下内容,而不是使用for语句

我在一个结构中定义了大约1000个矩阵(所有的维度都相同)

A{1}=matrix1 A{2}=matrix2 ... A{1000}=matrix1000

B是与a{n}维数相同的常数矩阵

我想计算A{n}和B的逐元素乘积,并将所有结果元素的总和返回到

for k=1:1000
  AllSum(k) = sum(sum(A{k}.*B))
end

A的尺寸取决于参数,典型尺寸为300x300。如果我运行上述循环一次,速度正常。但该循环将在另一个块中执行,该块将被多次调用,因此需要相当长的时间才能找到所有的和。我想知道是否有什么办法来提高它。谢谢

在您的特定情况下,您可以先计算所有
A
矩阵的总和,然后乘以
B
。与其将
A
定义为单元数组,不如将它们定义为一个3d数组:(我同意@SeçkinSavaşı的观点)

而不是:

A{i} = ...
然后,求和并乘以
B

result = sum(A,3).* B;

同意使用3d矩阵而不是单元格

产品的总和让你想起了什么?点积。一系列的dot产品让你想起了什么?向量矩阵乘法。所以你要做的是重塑你的数据,使你的矩阵的每一列都是一个未包装的A{k},而你的B行向量就是你的未包装的B矩阵。换句话说,A和B是2D的事实与计算无关

如果按照建议将A转换为
A(:,:,k)=A{k}
,则:

vec = B(:).';
mtx = reshape(A, size(A,1)*size(A,2), size(A,3));
AllSum = vec*mtx;

我认为最后一段代码没有做我们想要的事情。首先求A的和,然后乘以B。我们需要(元素方面)将A的一部分乘以B,然后得到这个结果的元素和。@SeçkinSavaşı,如果我错了,请纠正我,(a1+a2+a3)*B和a1*B+a2*B+a3*是一样的,谢谢你的启发。但他对数组中的每k存储不同的结果,据我所知,没有累积结果。换句话说,他的结果给我们1000个元素,而你的结果给我们1000个元素100x100@SeçkinSavaşçı,我认为OP的意思是计算单个总和——看看他的句子——“返回所有结果元素的总和”。你是对的,代码片段按照你说的做了,但我猜他真正想要的是什么。嗨,彼得,我在兰德矩阵上尝试了这段代码,速度非常快。但是我忘记了一些我在问题中没有提到的事情(很抱歉)。。。实际上,A{k}是一个巨大但稀疏的矩阵,所以如果我们把它做成一个三维矩阵,它会有太多的零,最终会大大降低效率。
vec = B(:).';
mtx = reshape(A, size(A,1)*size(A,2), size(A,3));
AllSum = vec*mtx;