索引必须出现在索引表达式的最后

问题描述 投票:5回答:3

我有一个矢量CD1(120×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

是否有任何更改代码的想法可以让它做我想要的事情?

matlab loops for-loop indexing
3个回答
8
投票

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

Y{1}(1:3) 

是合法的。大括号({})表示数据提取,因此,这意味着您提取存储在单元格数组中位置1的数组,然后引用该数组的元素1至3。

符号

Y(1)(1:3)

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

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

3
投票

[我可能会建议其他方法

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转换为大小为Y的二维数组20x6,其中的列是您的部分,并直接在生成的矩阵上工作:

Y = reshape(CD1, 20, 6);
Z = Y(3:end,:)-Y(1:end-1,:);
MEAN_ABS_2ND_DIFF_RESULT = mean(abs(Z));
© www.soinside.com 2019 - 2024. All rights reserved.