MATLAB子矩阵在可变维度上

时间:2010-05-28 18:27:14

标签: matlab

我有一个可变维度矩阵X.我想要一个能在一个维度上得到X的前半部分的函数。 I.E.,我想要这样的事情:

function x = variableSubmatrix(x, d)
    if d == 1
        switch ndims(x)
            case 1
                x = x(1:end/2);
            case 2
                x = x(1:end/2, :);
            case 3
                x = x(1:end/2, :, :);
            (...)
        end
    elseif d == 2
        switch ndims(x)
            case 2
                x = x(:, 1:end/2);
            case 3
                x = x(:, 1:end/2, :);
            (...)
        end
    elseif (...)
    end
end

我不太清楚如何做到这一点。我需要快速,因为这将在计算中多次使用。

3 个答案:

答案 0 :(得分:7)

这应该可以解决问题:

function x = variableSubmatrix(x, d)
  index = repmat({':'},1,ndims(x));  %# Create a 1-by-ndims(x) cell array
                                     %#   containing ':' in each cell
  index{d} = 1:size(x,d)/2;          %# Create an index for dimension d
  x = x(index{:});                   %# Index with a comma separated list
end

上面首先在每个单元格中创建一个带有ndims(x)的1-by-':'单元阵列。然后,对应于维度d的单元格将替换为包含数字1到维度d大小的一半的向量。然后,单元格数组的内容输出为comma-separated list(使用{:}语法)并用作x的索引。这是有效的,因为':':在索引语句中使用时的处理方式相同(即“此维度的所有元素”)。

答案 1 :(得分:0)

您可以使用s = size(X)获取X的维度,然后尝试使用X(1:floor(s(1)),:)获取矩阵的一半。

请注意size返回一个包含每个维度长度的向量数组(例如,2x3矩阵将返回[2 3]的大小)。因此,您可能希望将s(1)更改为您需要的任何维度。

示例:

a = [1 2 3 4; 5 6 7 8;]

s = size(a);          % s = [2 4]

b = a(1:s(1)/2,:);    % b = [1 2 3 4];
c = a(:,1:s(2)/2);    % c = [1 2; 5 6];

答案 2 :(得分:0)

对于它的价值,这是Python中的解决方案(带numpy):

将尺寸i减半:

def halve(x,i):
    return x[(slice(None),)*i+(slice(x.shape[i]/2),)]

x = zeros([2,4,6,8])
y = halve(x,2) # dimension 2 was 6
y.shape # (2,4,3,8) # dimension 2 is now 3

如果您只想将第一个维度减半,那么x[:len(x)/2]就足够了。

修改

我在之前的解决方案x[:len(x)/2]上得到了一些怀疑论者的评论,所以这是一个例子:

x=zeros([4,2,5,6,2,3]) # first dimension is 4
len(x) # 4
x.shape # 4,2,5,6,2,3
x[:len(x)/2].shape # 2,2,5,6,2,3 <- first dimension divided by two