【问题标题】:How to vectorize Matlab code?如何向量化 Matlab 代码?
【发布时间】: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


【解决方案1】:

如果你不需要L,你可以向量化如下:

qSum = [0,cumsum(q)]; %// assumes q is 1-by-n
lenr = To-From+1;
UC = qSum(To+1)-qSum(From);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-11-18
    • 1970-01-01
    相关资源
    最近更新 更多