【问题标题】:Linear span of a vector in MATLABMATLAB中向量的线性跨度
【发布时间】: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 for-loop vector


    【解决方案1】:

    为此,您不需要多个 for 循环。下面的代码将所有需要的向量生成为 tall 矩阵的行。它实际上一次创建一个矩阵的。每列将有数字 1:m(i) 以

    的模式排列
    • 每一项重复的次数等于 m(i) 之后所有 m 数的乘积
    • 整个模式重复的次数等于 m(i) 之前所有 m 数的乘积

    这就是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
    

    【讨论】:

    • 谢谢,这真的很有帮助。
    • 嗨!我为我们做了一个聊天室,这样我们就可以讨论与 MATLAB 相关的事情,这些事情可能离题,或者跨越的时间超过了 cmets 框中的内容。有时间就过来看看吧! chat.stackoverflow.com/rooms/81987/matlab
    猜你喜欢
    • 2016-03-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多