在VBA中,我可以执行以下操作:
A = B + IIF(C>0, C, 0)
Run Code Online (Sandbox Code Playgroud)
所以,如果C> 0,我得到A=B+C,C <= 0,我得到A=B
是否有一个运算符或函数可以让我在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)
有任何想法吗?谢谢.
我想将一个向量拼接成一个函数调用,但我找不到这样做的方法.可能吗?
为了扩展我的意思,我们说我们有x长度向量n和f带n参数的函数.我想f(x(1), x(2), ..., x(n))通过调用类似f(x)或类似的东西来打电话f(splice(x)).如果x是单元格数组而不是向量,则调用f(x{:})将获得所需的结果; 只有x向量时才会有一些等价物似乎是合理的.
我希望我缺少一些操作员或功能.我可以打电话y = num2cell(x)跟随f(y{:}),但这不是我正在寻找的.
我在使用点符号应用方法后尝试引用对象属性时遇到问题.它只发生在我尝试索引初始对象时
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)
有任何想法吗?
在这篇文章中,我使用的术语切片来指代一个子阵列B_i的的Ñ维阵列A,使得size(B_i, d)为1,对于一些尺寸d. A由size(A, d)这些切片组成,沿着维度连接d.
例如,如果ndims(A)是6并且d是3,那么表单的表达式
A(:, :, i, :, :, :)
Run Code Online (Sandbox Code Playgroud)
为i在1: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) 我正在编写一个函数来从单元格数组中删除一些值,如下所示:
function left = remove(cells, item);
left = cells{cellfun(@(i) ~isequal(item, i), cells)};
Run Code Online (Sandbox Code Playgroud)
但是当我运行它时,left只有第一个值,因为使用逻辑数组调用cells {}会将所有匹配的单元格作为单独的值返回.如何将这些单独的返回值分组到单个单元格数组中?
此外,也许已经有办法从单元格数组中删除给定的项目?我在文档中找不到它.
在什么情况下我可以将文字:传递给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, :).
假设我有一个单元阵列A和B,像这样:
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函数交错两个列表,如拉链.)
对于非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) 从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)
而且我不知道怎么做.我也有一些困难谷歌搜索这个信息.
谢谢!