【问题标题】:Check matrix size with potential trailing singleton dimension in matlab在matlab中检查具有潜在尾随单维的矩阵大小
【发布时间】:2013-03-19 17:48:52
【问题描述】:

我想验证(在函数中),矩阵A 的大小是a x b x c,其中可能是c=1

到目前为止我有:

if size(A) ~= [ a b c ]
    error('bad size');
end

但是,如果c=1(并且A 具有所需的大小):

size(A) = [ a b ]

因为size 删除了尾随的单件维度。因此,比较会导致错误,因为向量([a b][a b c])的大小不同。

还有什么比这更好的

if c == 1 && size(A) ~= [ a b ] || c ~= 1 && size(A) ~= [ a b c ]
    error('bad size');
end

?

【问题讨论】:

    标签: matlab


    【解决方案1】:

    validateattributes 完成这项工作:

     validateattributes(A, {'numeric'}, {'size', [ a b c ]});
    

    如果c=1A 的尺寸正确,则不会失败。

    【讨论】:

    • 这不是你自己的问题吗? :D
    • 是的,后来才找到答案。 validateattributes 绝对是做我想做的更好的方法,因为它还会生成错误消息并验证类型(涉及一些自定义类)。
    • @jucestain 我应该等 48 小时才能做到这一点。 blog.stackoverflow.com/2009/01/accept-your-own-answers
    【解决方案2】:

    size(A) 的输出因调用方式而异。对于您的情况,您可以简单地使用:

    [a1,b1,c1] = size(A);
    if(any([a1,b1,c1]~=[ a b c ]))
        error('bad size');
    end
    

    【讨论】:

    • 你可以写成any,而不是sum
    • @EitanT:是的,这样会更有意义。谢谢。答案已编辑。
    • 谢谢你。有趣的是,在赋值后,我们可以将附加元素添加到大小向量中。
    • 确实如此。顺便说一句,我的第一个解决方案也是如此。
    • @Memming:如果A 的维度超过3 个,则最后n-2 个维度的乘积将简单地计算为c1。例如,如果A 的大小为1x2x3x4x5a1 = 1b1 = 2c1 = 3*4*5。不过这应该不是问题,因为@gzm0 只想将大小与[a b c] 进行比较,如果比较的向量的大小不是1x3,这将是无效的。
    【解决方案3】:

    另一种解决方案是:

    if (size(A) ~= [ a b c ](1:ndims(A)))
        error('bad size');
    end
    

    只要 A 的维度不超过 3,这将起作用。如果 A 确实有超过 3 个维度,那么您将需要事先有一个条件:

    if (ndims(A)>3 || size(A)~=[a b c](1:ndims(A)))
        error('bad size');
    end
    

    显然,如果 A 超出第三个维度的维度是单例维度,这将认为它的大小不好……但这可能是可以接受的。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多