如何为 MATLAB 中的一般输入量循环输入?

How to loop over inputs for a general amount of inputs in MATLAB?

我有一个 (K x KM) 矩阵 A,其中矩阵的前 (K x K) 个元素 A_1 是函数的第一个参数,最后 M (K x K) 个元素 A_M 是函数的最后输入。

M 是任意的,由矩阵 A 上的大小决定。

我需要的是用于计算的 MATLAB 代码:

blkdiag(A_1,A_2,...,A_M) 

我考虑过使用 sprintfeval 的循环,但这似乎效率不高。我发现的一种有效解决方案是:

B = kron(ones(1,M),A')
for ii=1:size(B,1)
  for jj=1:size(B,2)
    if ii+jj in off diagonal block
      B(ii,jj)=0;
    end
  end
end

但我想要一些不需要弄清楚循环的东西。

一种选择是使用 mat2cell, then pass them to blkdiag as a comma-separated list:

将您的各个矩阵收集到元胞数组的单独元胞中
>> A = rand(3, 9)

A =

    0.6892    0.0838    0.1524    0.9961    0.1067    0.7749    0.0844    0.8001    0.1818
    0.7482    0.2290    0.8258    0.0782    0.9619    0.8173    0.3998    0.4314    0.2638
    0.4505    0.9133    0.5383    0.4427    0.0046    0.8687    0.2599    0.9106    0.1455

>> [r, c] = size(A);
>> B = mat2cell(A, r, r.*ones(1, c/r));
>> B = blkdiag(B{:})

B =

    0.6892    0.0838    0.1524         0         0         0         0         0         0
    0.7482    0.2290    0.8258         0         0         0         0         0         0
    0.4505    0.9133    0.5383         0         0         0         0         0         0
         0         0         0    0.9961    0.1067    0.7749         0         0         0
         0         0         0    0.0782    0.9619    0.8173         0         0         0
         0         0         0    0.4427    0.0046    0.8687         0         0         0
         0         0         0         0         0         0    0.0844    0.8001    0.1818
         0         0         0         0         0         0    0.3998    0.4314    0.2638
         0         0         0         0         0         0    0.2599    0.9106    0.1455

这是另一个解决方案

B = kron(speye(M),ones(K));
B(logical(B)) = A;