【发布时间】:2018-09-14 20:24:23
【问题描述】:
我尝试对以下内容进行矢量化:
for i = 2:n
mat = NaN(m,i);
for j = 1:m
mat(j,:) = getVal(i);
end
num(i) = max(mat(:));
end
进入
for i = 2:n
mat = NaN(m,i);
j = 1:m;
mat(j,:) = getVal(i);
num(i) = max(mat(:));
end
但是,MATLAB 给我一个错误:“下标赋值维度不匹配”我不确定我的代码哪里出错了?
另外,是否可以矢量化整个嵌套的 for 循环,而不仅仅是内部循环?
谢谢!
编辑:抱歉,getVal() 函数返回一个大小为“i”的随机向量。这用于在提供的代码中填充矩阵的行,因此这篇文章的问题标题为“Vectorize a for loop to fill row”。抱歉,如果不清楚。
样本数据: 对于 i = 2,输出将如下所示: Matrix Output 1 矩阵的行在内循环中一次填充一个。 对于 i = 3,它与上面的相同,改为 3 列: Matrix Output 2
希望这很清楚吗?
编辑 2: 我刚刚按照 Cris Luengo 的解决方案的建议尝试使用 repmat。这是我的输出:Matrix Output with repmat。我需要每次运行函数 getVal,而不是简单地运行一次并将其内容复制到行中。
编辑 3: 好的,这是我的函数 getVal(i):
function [A] = getVal(m)
X = normrnd(0,1,[m,m]);
A = triu(X) + triu(X)';
A = A - diag(diag(A))/2;
A = eig(A)';
end
【问题讨论】:
-
1. 请提供一些示例数据来运行您的循环。 2.
getVal是矩阵吗?它是一个功能吗?它是什么?请提供minimal reproducible example。 3.请解释一下你的循环是做什么的。 -
抱歉!刚刚更新了! @SardarUsama
-
@CrisLuengo 是的,你是对的。我似乎误解了矢量化的概念,并天真地认为它会加快进程。如果有帮助,我上传了该功能。
-
@CrisLuengo 抱歉,我已经解决了。它运行良好,只是错过了最后一行。
-
@StaticCrazee:
eig使得矢量化变得困难。 this FileExchange submission 将eig计算向量化,但仅适用于 2x2 或 3x3 矩阵。我不知道如何矢量化您的代码。但是你的问题现在已经完成了,所以我要推翻我的反对意见。
标签: matlab optimization vectorization nested-loops