相关疑难解决方法(0)

是否有一个Matlab条件IF运算符可以像VBA的IIF一样放在INLINE中

在VBA中,我可以执行以下操作:

A = B + IIF(C>0, C, 0)
Run Code Online (Sandbox Code Playgroud)

所以,如果C> 0,我得到A=B+C,C <= 0,我得到A=B

是否有一个运算符或函数可以让我在MATLAB代码中内联这些条件?

matlab vba ternary-operator conditional-operator iif

27
推荐指数
4
解决办法
3万
查看次数

更新Matlab结构数组的每个元素中的一个字段

假设我有一个struct数组arr,其中每个元素都有一堆字段,包括一个字段val.我想将每个元素的val字段增加一些常量,如下所示:

for i = 1:length(arr)
    arr(i).val = arr(i).val + 3;
end
Run Code Online (Sandbox Code Playgroud)

这显然有效,但我觉得应该有一种方法可以在一行代码中执行此操作(并且没有for循环).我想出的最好的是两行,需要一个临时变量:

newVals = num2cell([arr.val] + 3);
[arr.val] = deal(newVals{:});
Run Code Online (Sandbox Code Playgroud)

有任何想法吗?谢谢.

arrays matlab struct field assign

19
推荐指数
1
解决办法
1万
查看次数

Matlab ---将矢量拼接成函数调用的参数

我想将一个向量拼接成一个函数调用,但我找不到这样做的方法.可能吗?

为了扩展我的意思,我们说我们有x长度向量nfn参数的函数.我想f(x(1), x(2), ..., x(n))通过调用类似f(x)或类似的东西来打电话f(splice(x)).如果x是单元格数组而不是向量,则调用f(x{:})将获得所需的结果; 只有x向量时才会有一些等价物似乎是合理的.

我希望我缺少一些操作员或功能.我可以打电话y = num2cell(x)跟随f(y{:}),但这不是我正在寻找的.

matlab

14
推荐指数
1
解决办法
2840
查看次数

索引对象点符号方法给出标量属性

我在使用点符号应用方法后尝试引用对象属性时遇到问题.它只发生在我尝试索引初始对象时

classdef myclassexample

properties
    data
end    

methods   
    function obj = procData(obj)            
        if numel(obj)>1
            for i = 1:numel(obj)
                obj(i) = obj(i).procData;
            end
            return
        end
        %do some processing
        obj.data = abs(obj.data);
    end
end
end
Run Code Online (Sandbox Code Playgroud)

然后分配以下内容

A = myclassexample;
A(1).data= - -1;
A(2).data =  -2;
Run Code Online (Sandbox Code Playgroud)

当调用整个数组并收集属性数据时,它工作正常

[A.procData.data]
Run Code Online (Sandbox Code Playgroud)

如果我尝试索引A然后我只得到一个标量

[A([1 2]).procData.data]
Run Code Online (Sandbox Code Playgroud)

即使没有财产电话似乎没事

B  = A([1 2]).procData;
[B.data]
Run Code Online (Sandbox Code Playgroud)

有任何想法吗?

arrays oop syntax matlab matlab-class

14
推荐指数
1
解决办法
787
查看次数

关于形状不可知的切片的ndarrays

在这篇文章中,我使用的术语切片来指代一个子阵列B_i的的Ñ维阵列A,使得size(B_i, d)为1,对于一些尺寸d. Asize(A, d)这些切片组成,沿着维度连接d.

例如,如果ndims(A)是6并且d是3,那么表单的表达式

A(:, :, i, :, :, :)
Run Code Online (Sandbox Code Playgroud)

i1:size(A, d)代表所有片(沿维度d组成)A.

类似表达式的问题A(:, :, i, :, :, :)在于它不能象征性地概括为沿着与具有不同于6的维数的数组中的3的维度不同A的切片.例如,为了沿着维度2 获得切片,需要不同的表达式,A(:, i, :, :, :, :).这意味着这样的表达式在代码中是无用的,这些代码与要从中提取切片的某个数组的形状无关.

下面的函数是我的matlab-noob尝试实现与形状无关的切片.(这个名字slice已经被采用,因此我调用了函数hslice,简称为hyperslice.)函数的策略是将输入数组重新整形为一个合适的三维数组,沿着重新形成的数组的第二维获取所需的切片,并将结果重新整形为具有原始输入数组的切片形状.

function out = hslice(ndarray, d, i)
    sz = size(ndarray); …
Run Code Online (Sandbox Code Playgroud)

matlab multidimensional-array

13
推荐指数
1
解决办法
417
查看次数

如果MATLAB函数返回可变数量的值,我怎样才能将它们全部作为单元格数组?

我正在编写一个函数来从单元格数组中删除一些值,如下所示:

function left = remove(cells, item);
left = cells{cellfun(@(i) ~isequal(item, i), cells)};
Run Code Online (Sandbox Code Playgroud)

但是当我运行它时,left只有第一个值,因为使用逻辑数组调用cells {}会将所有匹配的单元格作为单独的值返回.如何将这些单独的返回值分组到单个单元格数组中?

此外,也许已经有办法从单元格数组中删除给定的项目?我在文档中找不到它.

matlab function

11
推荐指数
1
解决办法
7391
查看次数

我什么时候可以传递一个文字:一个函数?

在什么情况下我可以将文字:传递给Matlab函数?我通过实验发现,有时,文字:作为字符串传递':',但在其他情况下,会引发错误.例如:

>> type writeargs

function writeargs(varargin)

disp(varargin);

end

>> writeargs(:)
Undefined variable writeargs.

>> writeargs(:, 1)
Undefined variable writeargs.

>> writeargs(:, 1, :)
    ':'    [1]    ':'

>> writeargs(:, :, :)
    ':'    ':'    ':'

>> writeargs(1, 2, :, 4, 5)
    [1]    [2]    ':'    [4]    [5]

>> writeargs(1, 2, :, end)
Error using writeargs
Too many output arguments.
Run Code Online (Sandbox Code Playgroud)

我的印象是,如果传递至少三个参数,则允许使用此语法.这似乎是武断的.这里的法律语法是什么?

编辑:评论要求用例.用例可以是我的参数将被用作切片或索引.在Python代码中,我遇到了将切片对象传递给方法的情况.一个用例是针对一个函数,例如受到这个答案的启发,其中一个小函数用于绕过Matlabs无法解释magic(5)(3, :),并且可以编写辅助函数并调用它paren(magic(5), 3, :).

syntax matlab slice

11
推荐指数
1
解决办法
522
查看次数

是否有将两个单元阵列"压缩"在一起的功能?

假设我有一个单元阵列AB,像这样:

A = {'A' 'B' 'C' 'D'};
B = {1 2 3 4 };
Run Code Online (Sandbox Code Playgroud)

我想C通过"压缩"A和B 来创建单元阵列,如下所示:

C = zip(A,B)
C = 
    'A' 1 'B' 2 'C' 3 'D' 4
Run Code Online (Sandbox Code Playgroud)

这样的功能存在吗?(显然这样的函数写起来并不困难,但是懒惰是程序员最好的朋友,如果这样的函数已经存在,我宁愿使用它.)

(我从Perl那里得到了这个想法,其中List::MoreUtils包提供了zip执行此操作的功能.该名称来自于zip函数交错两个列表,如拉链.)

arrays matlab

11
推荐指数
1
解决办法
6821
查看次数

如何通过regexp删除尾随注释?

对于非MATLAB的读者:不确定他们属于哪个系列,但是这里将详细介绍MATLAB正则表达式.MATLAB的注释字符是%(百分比),其字符串分隔符是'(撇号).字符串内的字符串分隔符写为double-apostophe('this is how you write "it''s" in a string.').更复杂的是,矩阵转置运算符也是撇号(A'(Hermitian)或A.'(常规)).

现在,由于黑暗的原因(我不会详细说明:),我试图用MATLAB自己的语言解释MATLAB代码.

目前我正在尝试删除字符串单元格数组中的所有尾随注释,每个字符串都包含一行MATLAB代码.乍一看,这似乎很简单:

>> str = 'simpleCommand(); % simple trailing comment';
>> regexprep(str, '%.*$', '')
ans =
    simpleCommand(); 
Run Code Online (Sandbox Code Playgroud)

但是,当然,这样的事情可能会出现:

>> str = ' fprintf(''%d%*c%3.0f\n'', value, args{:}); % Let''s do this! ';
>> regexprep(str, '%.*$', '') 
ans = 
    fprintf('        %//   <-- WRONG!
Run Code Online (Sandbox Code Playgroud)

显然,我们需要从匹配中排除驻留在字符串内的所有注释字符,同时还要考虑直接在语句后面的单个撇号(或点 - 对照)是运算符,而不是字符串分隔符.

基于以下假设:注释字符的字符串打开/关闭字符数必须是偶数(我知道这是不完整的,因为矩阵转置运算符),我想出了以下动态正则表达式来处理这种情况:

>> str = {
       'myFun( …
Run Code Online (Sandbox Code Playgroud)

regex string matlab parsing

8
推荐指数
2
解决办法
1319
查看次数

Y = eye(K)(y,:); 替换"for"循环?Coursera

从Coursera机器学习开始分配任务.我很好奇这是如何工作的...从一个例子来看,这个更简单的代码:

% K is the number of classes.
K = num_labels;
Y = eye(K)(y, :);
Run Code Online (Sandbox Code Playgroud)

似乎是以下的替代品:

I = eye(num_labels);
Y = zeros(m, num_labels);
for i=1:m
  Y(i, :)= I(y(i), :);
end
Run Code Online (Sandbox Code Playgroud)

而且我不知道怎么做.我也有一些困难谷歌搜索这个信息.

谢谢!

matlab octave

7
推荐指数
1
解决办法
1772
查看次数