我正在编写一个函数,该函数要求在任意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
...
答案 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 answer,bringing it to my attention给予@chappjc。
答案 1 :(得分:0)
a = a(:, 1:end-1)
end
,用作矩阵索引,始终引用该矩阵的最后一个元素的索引
如果你想修剪不同的尺寸,最简单的方法是使用和if / else块 - 因为MatLab最多只支持7个维度,你不需要无限数量来覆盖所有基础
答案 2 :(得分:0)
permute
函数允许置换任何维度的数组的维度。
您可以将想要修剪的尺寸放在规定的位置(第一个,我猜),修剪,最后恢复原始顺序。通过这种方式,您可以避免运行循环并执行您想要的紧凑操作。