修剪指定尺寸的任意尺寸矩阵中的val

时间:2014-07-31 12:35:47

标签: arrays matlab matrix multidimensional-array

我正在编写一个函数,该函数要求在任意dimansions矩阵中的某些值被删除。

例如,假设我有一个3x3矩阵:

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

我可能想要删除每一行中的第三个元素,在这种情况下我可以做

a = a(:,1:2)

但是如果a的维度是任意的,并且trim的维度被定义为函数中的参数怎么办?

使用线性索引,一些精心考虑的数学是一个选项,但我想知道是否有更整洁的解决方案?

对于那些感兴趣的人,这是我目前的代码:

...
% Find length in each dimension
sz = size(dat);
% Get the proportion to trim in each dimension
k = sz(d)*abs(p);
% Get the decimal part and integer parts of k
int_part = fix(k);
dec_part = abs(k - int_part);

% Sort the array
dat = sort(dat,d);
% Trim the array in dimension d
if (int_part ~=0)
    switch d
       case 1
          dat = dat(int_part + 1 : sz(1) - int_part,:);
       case 2
          dat = dat(:,int_part + 1 : sz(2) - int_part);
    end
end
...

3 个答案:

答案 0 :(得分:1)

它没有比这更整洁:

function A = trim(A, n, d)
%// Remove n-th slice of A in dimension d
%// n can be vector of indices. d needs to be scalar

sub = repmat({':'}, 1, ndims(A));
sub{d} = n;
A(sub{:}) = [];

这利用了一个众所周知的事实,即 string ':'可以用作索引。 @AndrewJanke给予this answerbringing it to my attention给予@chappjc。

答案 1 :(得分:0)

a = a(:, 1:end-1)

end,用作矩阵索引,始终引用该矩阵的最后一个元素的索引

如果你想修剪不同的尺寸,最简单的方法是使用和if / else块 - 因为MatLab最多只支持7个维度,你不需要无限数量来覆盖所有基础

答案 2 :(得分:0)

permute函数允许置换任何维度的数组的维度。 您可以将想要修剪的尺寸放在规定的位置(第一个,我猜),修剪,最后恢复原始顺序。通过这种方式,您可以避免运行循环并执行您想要的紧凑操作。