【问题标题】:Changing elements of a large matrix according to a submatrix rule根据子矩阵规则改变大矩阵的元素
【发布时间】:2013-02-16 21:19:33
【问题描述】:

我有一个 105x105 矩阵 B(实际上是一个 35x35 的 矩阵连接组),我必须根据适用于 矩阵的规则更改其元素。

鉴于任何子矩阵每行只能有“1”,而“1”只能出现在 (1,1) 和/或 (2,2) 和/或 (3,3)。

因此唯一可能的子矩阵是

[0 0 0;0 0 0;0 0 0],变成[0 0 0;0 0 0;0 0 0]

[1 0 0;0 0 0;0 0 0],变成[1 1 1;0 0 0;0 0 0]

[0 0 0;0 1 0;0 0 0],变成[0 0 0;1 1 1;0 0 0]

[0 0 0;0 0 0;0 0 1],变成[0 0 0;0 0 0;1 1 1]

[1 0 0;0 1 0;0 0 0],变成[1 1 1;1 1 1;0 0 0]

[1 0 0;0 0 0;0 0 1],变成[1 1 1;0 0 0;1 1 1]

[0 0 0;0 1 0;0 0 1],变成[0 0 0;1 1 1;1 1 1]

和[1 0 0;0 1 0;0 0 1],变成[1 1 1;1 1 1;1 1 1]

我正在使用[1 1 1]*any(submatrix,2) 来更改值。遵守规则,它工作正常。但我使用以下循环遍历所有子矩阵:

    for i=1:3:103
     for j=1:3:103
      temp=A(i:i+2,j:j+2);
      temp=[1 1 1]*any(temp,2);
      A(i:i+2,j:j+2)=temp
     end
    end

难道没有替代的无循环方法吗?

【问题讨论】:

    标签: matlab optimization for-loop


    【解决方案1】:

    一种解决方案是重塑数组,以便重新分配变得容易:

    %# remember size of A
    [nRows,nCols] = size(A);
    
    %# reshape A to 3xn
    %# transpose so that we get each "row" as a separate column
    temp = reshape(A',3,[]);
    
    %# overwrite temp with the rows filled in 
    temp = repmat(any(temp,1),3,1);
    
    %# reshape to recreate the original array
    %# and transpose
    B = reshape(temp,nRows,nCols)';
    

    【讨论】:

    • 完美运行。您是如何想出这样一个解决方案的?
    • @KunalRmth:我只是在想操作是什么(如果它包含一个则用一个填充一行),然后想知道我们如何安排原始数组以方便操作。另外,我非常擅长使用 Matlab ;)
    • 既然您对 Matlab 非常熟悉,请参阅 stackoverflow.com/questions/14923458/…>,它确实需要去除一些循环。
    猜你喜欢
    • 1970-01-01
    • 2012-08-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-05-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多