【问题标题】:Two simple examples on vectorizing for loops in matlabmatlab中for循环向量化的两个简单例子
【发布时间】:2015-12-09 03:27:33
【问题描述】:

不幸的是,我的编程技能不是那么先进,我真的需要向量化一些循环来完成我的论文。 我试图让事情变得非常清晰和简单,我在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

感谢您的宝贵时间和帮助。

【问题讨论】:

  • 您的第二个问题究竟是什么?能解释清楚一点吗?

标签: matlab vector vectorization


【解决方案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

【讨论】:

    【解决方案2】:

    对于您的第一个问题。使用logical indexing

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-05-16
      • 1970-01-01
      • 2023-03-25
      • 2020-10-20
      • 2021-09-10
      • 1970-01-01
      • 2013-12-22
      • 2012-10-24
      相关资源
      最近更新 更多