6

我有一个向量CD1(120×1),我CD1分成 6 个部分。例如,第一部分从 CD1 中的第 1 行到第 20 行中提取,第二部分从 CD1 中的第 21 行到第 40 行中提取,依此类推。对于每个部分,我需要计算的二阶差的CD1绝对值的平均值数据

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

有什么想法可以更改代码以使其执行我想要的操作吗?

4

3 回答 3

9

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

Y{1}(1:3) 

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

符号

Y(1)(1:3)

不同之处在于它不提取数据,但它引用单元格的位置 1。这意味着第一部分 ( Y(1)) 返回一个cell -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
于 2012-11-29T14:57:39.327 回答
3

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

Y = reshape(CD1, 20, 6);
Z = diff(y(1:2:end,:));
MEAN_ABS_2ND_DIFF_RESULT = mean(abs(Z));
于 2012-11-29T15:04:30.517 回答
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将向量转换为 sizeCD1的二维数组,其中的列是您的部分,并直接在结果矩阵上工作:Y20x6

Y = reshape(CD1, 20, 6);
Z = Y(3:end,:)-Y(1:end-1,:);
MEAN_ABS_2ND_DIFF_RESULT = mean(abs(Z));
于 2012-11-29T15:35:48.877 回答