我有一个可变维度矩阵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
我不太清楚如何做到这一点。我需要快速,因为这将在计算中多次使用。
答案 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