相关疑难解决方法(0)

如何在不首先将其分配给局部变量的情况下索引函数返回的MATLAB数组?

例如,如果我想从中读取中间值magic(5),我可以这样做:

M = magic(5);
value = M(3,3);
Run Code Online (Sandbox Code Playgroud)

得到value == 13.我希望能够做到这样的事情之一:

value = magic(5)(3,3);
value = (magic(5))(3,3);
Run Code Online (Sandbox Code Playgroud)

免除中间变量.然而,MATLAB抱怨Unbalanced or unexpected parenthesis or bracket在第一个括号之前3.

是否可以在不首先将其分配给变量的情况下从数组/矩阵中读取值?

indexing matlab matrix return-value variable-assignment

350
推荐指数
7
解决办法
7万
查看次数

如何保留指定的维度之后的所有维度,而不显式列出它们?

或者等效地,"在Matlab中NumPy的省略号索引的等价物"

说我有一些高维数组:

x = zeros(3, 4, 5, 6);
Run Code Online (Sandbox Code Playgroud)

我想编写一个采用大小数组的函数,(3, ...)并进行一些计算.在NumPy中,我可以这样写:

def fun(x):
    return x[0]*x[1] + x[2]
Run Code Online (Sandbox Code Playgroud)

但是,MATLAB中的等效函数不起作用,因为使用一个整数进行索引会将数组展平为1d

function y = fun_bad(x)
    y = x(1)*x(2) + x(3)
Run Code Online (Sandbox Code Playgroud)

我可以用最多三维数组来完成这项工作

function y = fun_ok3d(x)
    y = x(1,:,:)*x(2,:,:) + x(3,:,:)
Run Code Online (Sandbox Code Playgroud)

如果我希望这适用于多达10维阵列,我可以写

function y = fun_ok10d(x)
    y = x(1,:,:,:,:,:,:,:,:,:)*x(2,:,:,:,:,:,:,:,:,:) + x(3,:,:,:,:,:,:,:,:,:)
Run Code Online (Sandbox Code Playgroud)

我怎样才能避免在这里编写愚蠢数量的冒号,只是让它适用于任何维度?是否有一些x(1,...)语法暗示这一点?

NumPy可以在索引表达式中使用...(Ellipsis)文字来表示" :根据需要多次",这将解决此问题.

matlab numpy

16
推荐指数
2
解决办法
966
查看次数

当我重载subsref(下标引用)时,为什么MATLAB会抛出"太多的输出参数"错误?

作为一个玩具示例,我有一个类,它简单地将一个向量或矩阵包装在一个对象中,并包含一个创建时间的时间戳.我试图超载subsref这样

  1. () 引用的工作方式与标准向量和矩阵类型完全相同
  2. {}引用的工作方式与引用完全相同()(换句话说,与单元格无关)
  3. .引用允许我访问对象的私有属性以及非技术属性的其他字段.

码:

classdef TimeStampValue

    properties (Access = private)
        time;
        values;
    end

    methods
        %% Constructor
        function x = TimeStampValue(values)
            x.time = now();
            x.values = values;
        end

        %% Subscripted reference
        function x = subsref(B, S)
            switch S.type
                case '()'
                    v = builtin('subsref', B.values, S);
                    x = TimeStampValue(v);
                case '{}'
                    S.type = '()';
                    v = builtin('subsref', B.values, S);
                    x = TimeStampValue(v);
                case '.'
                    switch S.subs
                        case 'time'
                            x …
Run Code Online (Sandbox Code Playgroud)

matlab operator-overloading

6
推荐指数
1
解决办法
7779
查看次数

是否有内置方式来翻转nd-array的第i维?

基本上,我正在寻找一个概括flipudfliplr翻转nd-array的第i维.

当要翻转的尺寸是第一个时,我想我可以使用

function flipped = flipfirst(ndarr)
    sz = size(ndarr);
    flipped = reshape(flipud(reshape(ndarr, sz(1), [])), sz);
end
Run Code Online (Sandbox Code Playgroud)

同样,如果要翻转的维度是最后一个,我可以使用

function flipped = fliplast(ndarr)
    sz = size(ndarr);
    flipped = reshape(fliplr(reshape(ndarr, [], sz(end))), sz);
end
Run Code Online (Sandbox Code Playgroud)

我确信我可以编写更通用的代码,通过调用permute和诸如此类的东西,但是有什么内置的吗?

我不确定reshape上面所有的内容是多么昂贵,但如果是的话,我也会对更有效的非内置方法感兴趣.

matlab multidimensional-array

3
推荐指数
2
解决办法
106
查看次数

字符可以用作索引吗?

我们来定义一下,例如,

x = 10:10:2000;
Run Code Online (Sandbox Code Playgroud)

众所周知,整数值可以用作索引:

>> x(9)
ans =
    90
Run Code Online (Sandbox Code Playgroud)

在Matlab中,通常可以在需要数字的地方使用字符,Matlab会自动进行转换.例如,由于ASCII码'a'97,

>> 'a'+1
ans =
    98
Run Code Online (Sandbox Code Playgroud)

字符也可以用作索引吗?Matlab会将它们转换为整数吗?

arrays matlab matrix matrix-indexing

3
推荐指数
1
解决办法
60
查看次数