【问题标题】:Matlab "for loop" to create a matrixMatlab“for循环”创建矩阵
【发布时间】:2013-01-16 19:30:10
【问题描述】:

我有一个相当大的向量,名为blender。我已经提取了blender 大于xn 元素(无关)。现在我的困难如下:

我正在尝试创建一个 (21 x n) 矩阵,其中包含搅拌机的每个元素加上之前的 10 个元素和之后的 10 个元素。

element=find(blender >= 120);

我一直在尝试以下变体:

for i=element(1:end)
    Matrix(i)= Matrix(blender(i-10:i+10));
end

然后我想在按 Enter 时绘制矩阵的一列。 第二部分我可以稍后弄清楚,但我会感谢一些帮助制作矩阵

谢谢

【问题讨论】:

    标签: matlab loops for-loop matrix


    【解决方案1】:

    首先,您可以使用数组的“逻辑索引”,它使用逻辑表达式来处理您的向量。使用blender = [2, 302, 35, 199, 781, 312, 8],它可能看起来像这样:

    >> b_hi = blender(blender>=120)
    b_hi =
           302  199  781  312
    

    其次,您可以像b_padded = [1, 2, b_hi, 3, 4] 那样连接数组。如果b_hi 是列向量,则应使用分号而不是逗号。

    第三,有一个函数reshape 可以让你把得到的向量变成一个矩阵。 doc reshape 会告诉你详情。例如,要将b_padded 转换为 2×4 矩阵,

    >> b_matrix = reshape(b_padded, 4, 2)
    b_matrix =
               1   302   781     3
               2   199   312     4
    

    会的。这意味着您可以在没有任何 for 循环的情况下完成所有工作。请注意,转置 reshape(b_padded, 2, 4) 的结果将为您提供另一个可能的 2×4 矩阵。您通过A' 获得矩阵A 的转置。你会发现你想要哪一个。

    【讨论】:

    • +1:显然 OP 在矢量化方面遇到了困难。为了清楚起见,我建议列出最终解决方案。
    • 我明白了,但是我如何获得前后的 10。假设 bleder 是 1:1:100。我提取了 60,也是元素 60。我希望 50:70 作为一列,然后是第二个提取元素的前后 10
    • 顺便谢谢你的帮助
    • 抱歉,我没有正确理解您的问题。 @shoelzer 的方法是正确的。如果您的索引范围向下有效,则要考虑的另一个问题是上限。请参阅下面的评论。
    • 我不明白索引是如何成为问题的,因为k 是一个元素编号(从 608 到 22,543 的整数和正数),blender 是我的原始数据,0 到 153.7444
    【解决方案2】:

    您需要创建一个新矩阵,并使用两个索引,以便 Matlab 知道它正在分配给 2D 矩阵中的列。

    NewMatrix = zeros(21, length(element));
    for i = 1:length(element)
        k = element(i);
        NewMatrix(:,i)= Matrix(blender(k-10:k+10));
    end
    

    【讨论】:

    • 我最了解这个答案。当我尝试运行它时,我得到“下标索引必须是真正的正整数或逻辑”
    • 我猜k-10 最终是负数,所以它不是一个有效的索引。您需要决定在这种情况下应该发生什么。
    • 不,我最小的 k 是 608,我什至用 blender(k:k+10) 尝试过,同样的错误。
    • 那么blender 中的值可能不是Matrix 的有效索引。
    • 可能是这样,因为搅拌机没有整数
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-06-12
    相关资源
    最近更新 更多