有没有办法在中心列之前和之后使用该列进行分析?

时间:2012-08-01 17:37:50

标签: matlab matrix

我正在尝试对具有不同列数的数据集进行分析,但每次使用我的等式时我需要使用3列。我想使用我的数据集中的所有列(除了第一个和最后一个,因为它们不起作用)但我需要选择一个中心列,前一列和后面的列。我需要实现这些方程式:

lower_actual = lower_original - dark;
lower_avg = sum(lower_actual)/length(lower_actual);
lower_gain = lower_avg./lower_actual;

upper_actual = upper_original - dark;
upper_avg = sum(upper_actual)/length(upper_actual);
upper_gain = upper_avg./upper_actual;

middle_actual = middle_original - dark;

x1 = lower_actual;
x2 = middle_actual;
x3 = upper_actual;
y1 = lower_gain;
y3 = upper_gain;
y2 = (((x2-x1).*(y3-y1))./(x3-x1))+y1;
interpolate = y2.*middle_actual;

在这些等式中,变量与:

相关
lower = column before
middle = center column
upper = column after
dark = first column in data set

2 个答案:

答案 0 :(得分:2)

您可以使用HANKEL函数生成所有三个连续列的所有可能索引(第一列和最后一列除外):

示例:

>> X = rand(10,7);
>> idx = hankel((1:3)+1, 3+1:size(M,2)-1)
idx =
     2     3     4
     3     4     5
     4     5     6

每列按顺序为您提供X列的一个组合的前/中/后的索引:

interpolate = zeros(size(X,1), size(idx,2));
for i=1:size(idx,2)
    ind = idx(:,i);
    xLower = X(:,ind(1));
    xMiddle = X(:,ind(2));
    xUpper = X(:,ind(3));

    %# perform calculations
    interpolate(:,i) = ...;
end

答案 1 :(得分:1)

假设您处理矩阵M,例如

M = randn(10, 7);

只需跳过跳过第一个和最后一个列的列。

interpolate = zeros(size(M, 1), size(M, 2) - 2);
dark = M(:, 1);
% Loop over the columns. Do not use the first and the last column as
% center columns.
for idx = 2 : size(M, 2) - 2
    lower_original = M(:, idx);
    middle_original = M(:, idx + 1);
    upper_original = M(:, idx + 2);

    % Your computations.
    lower_actual = lower_original - dark;
    lower_avg = mean(lower_actual);
    lower_gain = lower_avg./lower_actual;

    upper_actual = upper_original - dark;
    upper_avg = mean(upper_actual);
    upper_gain = upper_avg./upper_actual;

    middle_actual = middle_original - dark;

    x1 = lower_actual;
    x2 = middle_actual;
    x3 = upper_actual;
    y1 = lower_gain;
    y3 = upper_gain;
    y2 = (((x2-x1).*(y3-y1))./(x3-x1))+y1;

    interpolate(:, idx - 1) = y2.*middle_actual;
end

获取的最大列索引为size(M, 2) - 3 + 2 == size(M, 2) - 1,即将跳过最后一列。