如何为 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)
我考虑过使用 sprintf
和 eval
的循环,但这似乎效率不高。我发现的一种有效解决方案是:
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;
我有一个 (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)
我考虑过使用 sprintf
和 eval
的循环,但这似乎效率不高。我发现的一种有效解决方案是:
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;