不幸的是,我的编程技巧不是那么先进,我真的需要对一些循环进行矢量化以完成我的论文。 我试图让事情变得非常简单明了,我在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
感谢您的时间和帮助。
答案 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)