【发布时间】:2015-12-19 11:32:24
【问题描述】:
我想对一段 matlab 代码进行矢量化处理。这是原始代码:
DelPos=find(q>I);
From=[0 DelPos]+1;
To=[DelPos I+J]-1;
L=cell(J,1);
UC=zeros(1,J);
for j=1:J
L{j}=q(From(j):To(j));
if ~isempty(L{j})
UC(j)=sum(r(L{j}));
end
end
这是我对它进行矢量化的尝试:
DelPos=find(q>I);
From=[0 DelPos]+1;
To=[DelPos I+J]-1;
L=cell(J,1);
UC=zeros(1,J);
L{1:J}=q(From(1:J):To(1:J));
UC(1:J)=sum(r(L{1:J}));
但是,它给出了一个错误:
The right hand side of this assignment has too few values to satisfy the left hand side.
Error in ParseSolution (line 37)
L{1:J}=q(From(1:J):To(1:J));
更新:
我终于用二维数组替换了单元格,但是仍然无法向量化代码:
L=zeros(J,3000);
UC=zeros(1,J);
lenr=zeros(1,J);
for j=1:J
ro=q(From(j):To(j));
lenr(j)=length(ro);
L(j,1:lenr(j))=ro;
if ~isempty(L(j,1:length(ro)))
UC(j)=sum(r(L(j,1:length(ro))));
end
end
我的矢量化版本如下,但ro=q(From(1:J):To(1:J)) 总是被最后一个 J 代替:
ro=q(From(1:J):To(1:J));
lenr(1:J)=length(ro(1:J));
L(1:J,1:lenr(1:J))=ro(1:J);
UC(1:J)=sum(r(L(1:J,1:length(ro(1:J)))));
【问题讨论】:
-
您可以使用常规数组而不是元胞数组吗?它们的性能可能更好。
-
@Divakar:如果我只是将 L 转换为数组(L=zeros(J,1)),那么这一行 L(j)=q(From(j):To(j))返回错误:在赋值 A(I) = B 中,B 和 I 中的元素数必须相同。 ParseSolution 中的错误(第 39 行)L(j)=q(From(j):To(j))
-
@Divakar:看起来我无法切换到数组,因为 q(From(j):To(j)) 返回一个数组,我无法将它保存在 L(j) 中。跨度>
-
@KlausosKlausos 你能提供
q和I的例子吗? -
@brainkz:我是一个数字,例如1070.q是1x1070双数组。
标签: matlab vectorization