【问题标题】:Matlab - if exists a faster way to assign values to big matrix?Matlab - 如果存在一种更快的方法来为大矩阵赋值?
【发布时间】:2013-10-04 16:06:26
【问题描述】:

我是一名学习使用 Matlab 的新学生。 谁能告诉我有没有更快的方法可能没有循环: 为每一行分配两个值 1, -1 到一个大稀疏矩阵的不同位置。

我为 MILP 条件问题构建双矩阵或双矩阵的代码:

f^k_{ij}

天真的方法:

双矩阵=[];

% 创建每一行然后添加到双矩阵

newrow4= zeros(1,n*(n+1)^2);

for k=1:n

    for i=0:n
        for j=1: n
            if j~=i          
                %change value of some positions to -1 and 1 
                newrow4(i*n^2+(j-1)*n+k)=1;
                newrow4((n+1)*n^2+i*n+j)=-1;
                % add to bimatrix
                bimatrix=[bimatrix; newrow4];
                % change newrow4 back to zeros row.
                newrow4(i*n^2+(j-1)*n+k)=0;
                newrow4((n+1)*n^2+i*n+j)=0;
            end
        end
    end
end

或者:

% 先生成大稀疏矩阵。

bibimatrix=zeros(n^3 ,n*(n+1)^2);

t=1;

for k=1:n

    for i=0:n
        for j=1: n
            if j~=i           
                %Change 2 positions in each row to -1 and 1 in each row.
                bibimatrix(t,i*n^2+(j-1)*n+k)=1;
                bibimatrix(t,(n+1)*n^2+i*n+j)=-1;
                t=t+1
            end
        end
    end
end

在Matlab中使用上面的这些代码,生成这个n~12的矩阵的时间超过3s。我需要在更短的时间内生成更大的矩阵。

谢谢。

【问题讨论】:

  • 该索引的逻辑是什么?
  • 您的两个循环不会产生相同的输出。你也说它只包含 1 和 -1,但大多数条目都是 0。请检查代码是否正确并解释你的矩阵应该是什么样子。
  • 始终,始终为您的矩阵预分配内存!
  • @RobertP。他做到了。检查第一行。他创建了零矩阵。
  • @AlexandreBizeau,我不敢苟同。您对bibimatrix 的看法是正确的,但我看不到bimatrix 的初始化位置...

标签: performance algorithm matlab for-loop


【解决方案1】:

建议:使用sparse 矩阵。

您应该能够创建两个向量,其中包含您希望在每行中的 +1-1 的列号。我们称这两个向量为vec_1vec_2。您应该可以在没有循环的情况下执行此操作(如果没有,我仍然认为下面的过程会更快)。

让矩阵的大小为(max_row X max_col)。然后你可以像这样创建你的矩阵:

bibimatrix = sparse(1:max_row,vec_1,1,max_row,max_col);
bibimatrix = bibimatrix + sparse(1:max_row, vec_2,-1,max_row,max_col)

如果您想查看整个矩阵(您不想查看,因为它很大),您可以写:full(bibimatrix)

编辑: 你也可以这样做:

col_vec = [vec_1, vec_2];
row_vec = [1:max_row, 1:max_row];
s = [ones(1,max_row), -1*ones(1,max_row)];
bibimatrix = sparse(row_vec, col_vec, s, max_row, max_col)

免责声明:我没有可用的 MATLAB,因此它可能不会出错。

【讨论】:

  • 谢谢。我正在考虑与命令 sub2ind 类似的方式。不知道 sparse 或 sub2ind 中的哪一个会更快?
  • @VNese,我会把所有的钱都花在稀疏上。您的矩阵也非常大,因此您将使用稀疏技术节省大量内存,因为只存储非零元素。
猜你喜欢
  • 2011-09-24
  • 2018-07-16
  • 2013-02-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-10-19
  • 1970-01-01
  • 2023-04-10
相关资源
最近更新 更多