如何在 Matlab 中使用 size() 函数检索特定尺寸
How to retrieve specific dimensions using size() function in Matlab
这是维度 6x3x8x5
的示例矩阵 A
现在如果我使用 size(A)
,我会得到所有维度作为行向量
ans = [6 3 8 5]
如果我想获得特定维度(单数),我可以使用 size(A,1)
或 size(A,3)
等。
如果我想要指定的尺寸集,例如 3rd 和 4th 尺寸或 2nd 到 nth 维度
我想做的是 size(A,3:4)
或 size(A,2:n)
或 size(A,[1 3 4])
但从 Doc 看来,size 的输入维度只能是标量。当我尝试这样做时,出现了这个错误:
>> size(A,[2 3])
Error using size
Dimension argument must be a positive integer scalar within indexing range.
我希望输出是
ans = [3 8]
仅供参考:
我正在尝试将其作为输入参数传递给另一个函数,如下所示:
out = someFunction(arg1,arg2,size(A,[2 3]))
我现在正在做的是
[~,size2,size3,~] = size(A)
out = someFunction(arg1,arg2,[size2, size3])
我只是想不用第一行就直接用。显然当我们只有两个维度时,我们直接使用它只是通过size(A)
。为什么不在这种情况下?有什么替代方案可以使它成为单线的吗?
size
就是这么写的。
如果你想要单行,你可以使用subsref
索引size
的单输出形式:
out = someFunction(arg1,arg2,...
subsref(size(A),struct('type','()','subs',{{[2,3]}})));
如果您要经常这样做,请在 Matlab 路径的某处添加一个函数或添加一行:
sizes = @(A,dims) subsref(size(A),struct('type','()','subs',{{dims}}));
out = someFunction(arg1,arg2,sizes(A,[2,3]));
您还可以创建 sizes
而无需 直接 调用 subsref
通过函数句柄的一些间接调用:
getSizes = @(d,s) d(s);
sizes = @(A,s) getSizes(size(A),s);
这可能更清晰,更易于维护。
两种 Troy Haskin's answers and mine are borrowed from this question: How can I index a MATLAB array returned by a function without first assigning it to a local variable? I personally find the getfield
方法都适合您的情况,您只需将 getfield
包裹在 size
函数周围:
A = randn(1,2,3,4,5); %// 5D double
out = getfield(size(A),{[2 3]})
out =
2 3
使用 subsref
可能是更好的方法,因为它更直接、更快速,但它可能会降低您的代码的可读性,因为它是非常具体的 hack。
这是维度 6x3x8x5
A
现在如果我使用 size(A)
,我会得到所有维度作为行向量
ans = [6 3 8 5]
如果我想获得特定维度(单数),我可以使用 size(A,1)
或 size(A,3)
等。
如果我想要指定的尺寸集,例如 3rd 和 4th 尺寸或 2nd 到 nth 维度
我想做的是 size(A,3:4)
或 size(A,2:n)
或 size(A,[1 3 4])
但从 Doc 看来,size 的输入维度只能是标量。当我尝试这样做时,出现了这个错误:
>> size(A,[2 3])
Error using size
Dimension argument must be a positive integer scalar within indexing range.
我希望输出是
ans = [3 8]
仅供参考:
我正在尝试将其作为输入参数传递给另一个函数,如下所示:
out = someFunction(arg1,arg2,size(A,[2 3]))
我现在正在做的是
[~,size2,size3,~] = size(A)
out = someFunction(arg1,arg2,[size2, size3])
我只是想不用第一行就直接用。显然当我们只有两个维度时,我们直接使用它只是通过size(A)
。为什么不在这种情况下?有什么替代方案可以使它成为单线的吗?
size
就是这么写的。
如果你想要单行,你可以使用subsref
索引size
的单输出形式:
out = someFunction(arg1,arg2,...
subsref(size(A),struct('type','()','subs',{{[2,3]}})));
如果您要经常这样做,请在 Matlab 路径的某处添加一个函数或添加一行:
sizes = @(A,dims) subsref(size(A),struct('type','()','subs',{{dims}}));
out = someFunction(arg1,arg2,sizes(A,[2,3]));
您还可以创建 sizes
而无需 直接 调用 subsref
通过函数句柄的一些间接调用:
getSizes = @(d,s) d(s);
sizes = @(A,s) getSizes(size(A),s);
这可能更清晰,更易于维护。
两种 Troy Haskin's answers and mine are borrowed from this question: How can I index a MATLAB array returned by a function without first assigning it to a local variable? I personally find the getfield
方法都适合您的情况,您只需将 getfield
包裹在 size
函数周围:
A = randn(1,2,3,4,5); %// 5D double
out = getfield(size(A),{[2 3]})
out =
2 3
使用 subsref
可能是更好的方法,因为它更直接、更快速,但它可能会降低您的代码的可读性,因为它是非常具体的 hack。