关于matlab中循环矢量化的两个简单例子

时间:2015-09-12 19:00:56

标签: matlab vector vectorization

不幸的是,我的编程技巧不是那么先进,我真的需要对一些循环进行矢量化以完成我的论文。 我试图让事情变得非常简单明了,我在matlab中有以下两个问题:

1 如果我们有一个5x5矩阵A并且我们想要将该矩阵的对角元素设置为矩阵B的对角线,除了diag(A)= diag(B)之外我们可以使用:

    for i=1:5

    B(i,i)=A(i,i)

    end

现在,如果我想要矢量化,我就不能使用:

    i=1:5
    B(i,i)=A(i,i)

通过这种方式,我们将每个组合从1:5中取出。因此,最后我们将A的每个元素设为等于B而不是对角线。 是否有某种方式可以将每对相同的(i,i)对齐? 我试过了:

    i=1:5
    j=1:5
    B(i,find(j==i))=A(i,find(j==i))

但仍然无效。我再说一遍,我知道diag属性,但我只对特定问题感兴趣。

2

类似的问题是填充。 b = [(2,2)个(2,2)* 2个(2,2)* 3个(2,2)* 4];

    a         = zeros(8,12);

    for i=1:4             

    a((i-1)*2+1:(i)*2,(i-1)*3+1:(i)*3) =  [8*ones(2,1) b(:,[2*(i-1)+1 2*i])];

    end

感谢您的时间和帮助。

2 个答案:

答案 0 :(得分:1)

让我们来一些mask magic吧!

问题#1

mask = eye(size(A))==1
A(mask) = B(mask)

要创建蒙版,您还可以使用bsxfun -

N = size(A,1)
bsxfun(@eq,[1:N]',1:N)

或者最后,您可以使用linear indexing -

N = size(A,1)
A(1:N+1:N^2) = B(1:N+1:N^2)

示例运行 -

>> A
A =
     5     2     9     6     5
     9     1     6     2     2
     9     7     5     3     9
     4     5     8     8     7
     7     5     8     1     8
>> B
B =
     5     5     2     8     2
     1     1     6     5     2
     7     8     5     4     4
     1     8     9     8     8
     1     7     6     1     8
>> mask = eye(size(A))==1;
>> A(mask) = B(mask)
A =
     5     2     9     6     5
     9     1     6     2     2
     9     7     5     3     9
     4     5     8     8     7
     7     5     8     1     8

问题#2

%// Append 8's at the start of every (2,2) block in b
b1 = reshape([8*ones(2,4) ; reshape(b,4,[])],2,[])

%// Mask where b1 values are to be put in an otherwise zeros filled array
mask = kron(eye(4,4),ones(2,3))==1

%// Initialize output arraya and set values from b1 into masked places 
out = zeros(size(mask))
out(mask) = b1

答案 1 :(得分:0)

第一个问题。使用logical indexing

index = diag(ones(1,size(B,1))
B(index) = A(index)