【问题标题】:Indexing must appear last in an index expression索引必须出现在索引表达式的最后
【发布时间】:2012-11-17 15:48:04
【问题描述】:

我有一个向量 CD1 (120-by-1),我将 CD1 分成 6 个部分。例如,第一部分从CD1中的第1行到第20行提取,第二部分从CD1中的第21行到第40行提取,等等。对于每个部分,我需要计算绝对值的平均值second differences of the data.

for PartNo = 1:6   

    % extract data                
    Y(PartNo) = CD1(1 + 20*(PartNo-1):20*(PartNo),:); 

    % find the second difference  
    Z(PartNo) = Y(PartNo)(3:end) - Y(PartNo)(1:end-2);  

    % mean of absolute value
    MEAN_ABS_2ND_DIFF_RESULT(PartNo) = mean(abs(Z));    

end

但是,上面的命令会产生错误:

()-indexing must appear last in an index expression for Line:2

有什么想法可以改变代码让它做我想做的事吗?

【问题讨论】:

  • Y(PartNo) 不是标量吗?而 rhs 是一个向量?
  • 那么写这样的东西是什么意思:Y(1) = [1 2 3]?后来Y(1)(3:end) - 标量索引?
  • 等等...我担心我误解了你的问题。忘记我的回答,改用@dustincarr 的解决方案:)
  • 只是一般性评论:空白是免费的!在计算机编辑器中没有纸张可以保存,并且更密集的代码不会使其更快,所以......打开它一点,它对眼睛更好:)
  • @RodyOldenhuis,您实际上比我回答的具体问题要好得多,因为这些问题专门针对错误消息。

标签: matlab loops for-loop indexing


【解决方案1】:

Y 是元胞数组时,经常会遇到此错误。对于元胞数组,

Y{1}(1:3) 

是合法的。花括号 ({}) 表示 数据提取,因此这意味着您要提取存储在元胞数组中位置 1 的数组,然后引用元素 1 到 3那个数组。

符号

Y(1)(1:3)

不同之处在于它不提取数据,但它引用单元格的位置 1。这意味着第一部分 (Y(1)) 返回一个 单元格-array在您的情况下,它包含一个数组。因此,您将无法像以前那样直接访问常规数组。

Matlab 中一个臭名昭著的限制是您不能进行间接或双重引用,这实际上就是您在这里所做的。

因此错误。

现在,要解决:我怀疑用花括号替换几个普通大括号会解决问题:

Y{PartNo} = CD1(1+20*(PartNo-1):20*PartNo,:);   % extract data
Z{PartNo} = Y{PartNo}(3:end)-Y{PartNo}(1:end-2);  % find the second difference
MEAN_ABS_2ND_DIFF_RESULT{PartNo} = mean(abs(Z{PartNo}));  % mean of absolute value

【讨论】:

    【解决方案2】:

    我可能会建议一种不同的方法

    Y = reshape(CD1, 20, 6);
    Z = diff(y(1:2:end,:));
    MEAN_ABS_2ND_DIFF_RESULT = mean(abs(Z));
    

    【讨论】:

      【解决方案3】:

      这不是 matlab 中的有效语句:

      Y(PartNo)(3:end)
      

      您应该将Y 设为二维并使用此索引

      Y(PartNo, 3:end)
      

      或提取矢量部分并直接使用它们,如果您使用所示的循环

      for PartNo = 1:6   
      
          % extract data                
          Y = CD1(1 + 20*(PartNo-1):20*(PartNo),:); 
      
          % find the second difference  
          Z = Y(3:end) - Y(1:end-2);  
      
          % mean of absolute value
          MEAN_ABS_2ND_DIFF_RESULT(PartNo) = mean(abs(Z));    
      end
      

      另外,由于CD1 是一个向量,您不需要索引第二个维度。删除:

      Y = CD1(1 + 20*(PartNo-1):20*(PartNo));
      

      最后,您不需要循环。您可以将reshape CD1 向量转换为大小为20x6 的二维数组Y,其中的列是您的部分,并直接处理生成的矩阵:

      Y = reshape(CD1, 20, 6);
      Z = Y(3:end,:)-Y(1:end-1,:);
      MEAN_ABS_2ND_DIFF_RESULT = mean(abs(Z));
      

      【讨论】:

        猜你喜欢
        • 2023-03-29
        • 2016-01-23
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2022-01-19
        • 2015-01-26
        • 1970-01-01
        相关资源
        最近更新 更多