【发布时间】:2023-04-06 22:07:01
【问题描述】:
我正在寻找一种在 MATLAB 中生成给定向量跨度的方法。
例如:
如果a = [ 0 1 0 1] 我需要[0 x 0 y] 形式的所有向量,1
如果
a = [ 0 1 0 1 1 0] 我需要[0 x 0 y z 0], 1
请注意,向量可以有可变数量的 1。
我的第一印象是我需要可变数量的 for 循环,尽管我不知道这在 MATLAB 中是否可行。也欢迎任何其他想法!
【问题讨论】:
我正在寻找一种在 MATLAB 中生成给定向量跨度的方法。
例如:
如果a = [ 0 1 0 1] 我需要[0 x 0 y] 形式的所有向量,1
如果
a = [ 0 1 0 1 1 0] 我需要[0 x 0 y z 0], 1
请注意,向量可以有可变数量的 1。
我的第一印象是我需要可变数量的 for 循环,尽管我不知道这在 MATLAB 中是否可行。也欢迎任何其他想法!
【问题讨论】:
为此,您不需要多个 for 循环。下面的代码将所有需要的向量生成为 tall 矩阵的行。它实际上一次创建一个矩阵的列。每列将有数字 1:m(i) 以
的模式排列这就是repmat(kron(1:m(i),ones(1,after)),1,before)' 所做的。 (从 R2015a 开始,您可以使用 repelem 通过替换 kron 命令来简化此操作,但我还没有该版本。)
a = [0 1 0 1 1 0];
m = [2 4 3]; // the numbers max1, max2, max3
A = zeros(prod(m), length(a));
i = 1; // runs through elements of m
for j=1:length(a) // runs through elements of a
if (a(j)>0)
before = prod(m(1:i-1));
after = prod(m(i+1:end));
A(:,j) = repmat(kron(1:m(i),ones(1,after)),1,before)';
i = i+1;
end
end
输出:
0 1 0 1 1 0
0 1 0 1 2 0
0 1 0 1 3 0
0 1 0 2 1 0
0 1 0 2 2 0
0 1 0 2 3 0
0 1 0 3 1 0
0 1 0 3 2 0
0 1 0 3 3 0
0 1 0 4 1 0
0 1 0 4 2 0
0 1 0 4 3 0
0 2 0 1 1 0
0 2 0 1 2 0
0 2 0 1 3 0
0 2 0 2 1 0
0 2 0 2 2 0
0 2 0 2 3 0
0 2 0 3 1 0
0 2 0 3 2 0
0 2 0 3 3 0
0 2 0 4 1 0
0 2 0 4 2 0
0 2 0 4 3 0
【讨论】: