我希望能够在Matlab中编写类似jasmine的测试.所以像
expect(myfibonacci(0)).toBe(0);
expect(myfibonacci(5)).toBe(15);
expect(myfibonacci(10)).toBe(55);
Run Code Online (Sandbox Code Playgroud)
我试图实现这两个策略:
(1)第一种策略使用结构
expect = @(actual_value) struct('toBe', @(expected_value) assert(actual_value == expected_value));
Run Code Online (Sandbox Code Playgroud)
(真正的实现不只是调用assert)
但是这不起作用:
expect(1).toBe(1); % this triggers a syntax error
??? Improper index matrix reference.
% this will work:
x = expect(1);
x.toBe(1);
Run Code Online (Sandbox Code Playgroud)
(2)我尝试的第二个策略是使用一个类:
classdef expect
properties (Hidden)
actual_value
end
methods
function obj = expect(actual_value)
obj.actual_value = actual_value;
end
function obj = toBe(obj, expected_value)
assert(obj.actual_value == expected_value);
end
end
end
Run Code Online (Sandbox Code Playgroud)
乍一看,这看起来很好:你可以在控制台中运行
expect(1).toBe(1);
Run Code Online (Sandbox Code Playgroud)
但是,不是在控制台中运行,而是在脚本中运行
??? Static method or constructor invocations cannot be indexed.
Do …Run Code Online (Sandbox Code Playgroud) 目前我正在试图取决于在一个月内的一些数据映射'Month','week','day'.
这意味着原则上我有三个键.我想到了解决问题的方法:
1)
containers.Map(month,containers.Map(week,containers.Map(day,value)))
这个解决方案的问题是引用它我必须使用:如何在不首先将其分配给局部变量的情况下索引函数返回的MATLAB数组?.
我发现这个解决方案相当"丑陋".
2)
另一种方法是使用Map带有多个键的方法.该容器文档显示,仅一维键是允许的.
题:
你有什么技巧可以解决这个多重关键问题吗?
更新/解决方案:
我最后使用串联字符串作为键(如建议的那样)我添加了以下代码片段以使其containers.Map成为正确的多维散列映射.看看下面(为了简化我排除了一周):
classdef example
properties
myMap % Map for storage
end
methods
function obj = example()
obj.myMap = containers.Map;
end
function obj2 = setVal(obj2,value,Month,DayType)
key = strcat(num2str(Month),'-',num2str(DayType));
obj2.myMap(key) = value;
end
function value = getValue(obj,Month,DayType)
key = strcat(num2str(Month),'-',num2str(DayType));
value = obj.myMap(key);
end
end
Run Code Online (Sandbox Code Playgroud) 我只是想知道end在知道向量的大小之前是否有一种使用索引的方法?它应适用于具有不同大小的阵列。像这样:
subvector = (2:end) % illegal use of end
A=[1 2 3];
B=[4 5 6 7];
A(subvector) % should be 2 3
B(subvector) % should be 5 6 7
Run Code Online (Sandbox Code Playgroud) 这是一个代码片段,它显示了我想要的内容和错误,如下所示:
a = [1, 2];
m = containers.Map('KeyType','char', 'ValueType','any');
m('stackoverflow.com') = a;
pull_the_first_element_of_the_stored_array = m('stackoverflow.com')(1);
??? Error: ()-indexing must appear last in an index expression.
Run Code Online (Sandbox Code Playgroud)
如何访问数组的元素,而元素又是地图对象的值?我本可以这样做的:
temp = m('stackoverflow.com');
pull_the_first_element_of_the_stored_array = temp(1);
Run Code Online (Sandbox Code Playgroud)
但我不想创建一个中间数组只是为了从中拉出一个值.
编辑:这是一个副本如何索引函数返回的MATLAB数组,而不首先将其分配给局部变量?答案就在那里.
所以我现在一直在想这个问题.总结一些数组变量A就像这样简单
sum(A(:))
% or
sum(...sum(sum(A,n),n-2)...,1) % where n is the dimension of A
Run Code Online (Sandbox Code Playgroud)
然而,一旦它到达表达式,它就(:)不再起作用了
sum((A-2*A)(:))
Run Code Online (Sandbox Code Playgroud)
是没有有效的matlab语法,而是我们需要编写
foo = A-2*A;
sum(foo(:))
%or the one liner
sum(sum(...sum(A-2*A,n)...,2),1) % n is the dimension of A
Run Code Online (Sandbox Code Playgroud)
如果A的尺寸是固定的,那么上面的一个衬垫将起作用,这取决于你正在做什么,可能不一定是这种情况.这两行的缺点是,foo将保留在内存中,直到你运行clear foo或甚至不可能,具体取决于A的大小和工作区中的其他内容.
有没有一种通用的方法来规避这个问题,并在一行中总结数组值表达式的所有元素/而不创建时间变量?有点像sum(A-2*A,'-all')?
编辑:它不同于如何在不首先将其分配给局部变量的情况下索引函数返回的MATLAB数组?,因为它不涉及数组值表达式或返回值的一般(或特定)索引,而是涉及每个可能索引的总和.
虽然可以通过链接中给出的答案解决我的问题,但是gnovice说自己使用subref是一个相当丑陋的解决方案.Andras Deak在下面的评论中发布了更为清晰的方式.
我在matlab中有以下代码
deltax=@(t)xt(t).'-xt(t);
deltay=@(t)yt(t).'-yt(t);
deltaz=@(t)zt(t).'-zt(t);
deltar=@(t)reshape([deltax(:) deltay(:) deltaz(:)].',3*(100+1),[]).';
Run Code Online (Sandbox Code Playgroud)
其中xt,yt,zt都明确定义的功能t.如果我做deltax(2),我得到一个包含101个条目的列数组,类似于deltay(2)和deltaz(2).
但是,当我打电话
deltar(2)
Run Code Online (Sandbox Code Playgroud)
我收到这个错误
Input arguments to function include colon operator. To input the colon character, use ':' instead.
Run Code Online (Sandbox Code Playgroud)
我也试过了
deltar=@(t)reshape([deltax(t)(:) deltay(t)(:) deltaz(t)(:)].',3*(100+1),[]).';
Run Code Online (Sandbox Code Playgroud)
但这给了我语法错误.
我必须做一些基本的matlab错误.
考虑以下单元格数组:
A={1:3,[20,40],100}
A =
1×3 cell array
{1×3 double} {1×2 double} {[100]}
Run Code Online (Sandbox Code Playgroud)
我想要一种方法来检索存储它的值的线性索引,例如,如果我使用以下方法展平数组:
[A{:}]
ans =
1 2 3 20 40 100
Run Code Online (Sandbox Code Playgroud)
我可以看到第4个线性索引是20等等.所以有没有类似于矩阵线性索引的方法,它将为我提供一个单元格数组中A((4))的值20?(我当然只是(())为了说明的目的发明了符号.
由于没有特殊原因,我想知道是否可以在一个数组或矩阵中选择n个最大值,所有这些都在oneliner中.
说我有阵列:
A=randn(1,100);
Run Code Online (Sandbox Code Playgroud)
我想要最大的,例如20个值,最好从高到低排序.到目前为止,我有2个班轮:
A_ordered = sort(A,'descend');
A_big20 = A_ordered(1:20);
Run Code Online (Sandbox Code Playgroud)
有谁知道这是否可能在一行?如果是这样,我会很感激线索,想法或答案!
只是一个简单的嵌套问题:
我有一个<100x100 double>矩阵mat_B,我cumsum.从结果矩阵中mat_A,我只需要最后一行vec_C,我需要cumsum再次使用.我的代码看起来像这样:
mat_A = cumsum(mat_B);
vec_C = cumsum(mat_A(end,:));
Run Code Online (Sandbox Code Playgroud)
我的问题是,如果可以将所有这些放在一行代码中.我知道cumsum(mat_B)返回一个矩阵,但是如果我放在(end, :)表达式后面,它将无法工作.
我知道这听起来很傻,但我想知道在这种情况下嵌套是如何工作的.
我有一个矩阵,说:
y=rand(100,101);
Run Code Online (Sandbox Code Playgroud)
现在我想平均第一维,并只使用部分输出(比如只有奇数索引)到另一个函数中.所以我能做到
ymean=mean(y,1)
Run Code Online (Sandbox Code Playgroud)
然后
ymean_partial=somefunction(ymean(1:2:length(ymean)))
Run Code Online (Sandbox Code Playgroud)
但我现在的问题是(假设有可能):我怎么能这样做而不必声明'虚拟变量' ymean?我想知道是否有一个我可以使用的单行,因为这个额外的变量占用了大量矩阵的大量内存(我倾向于喜欢单行).
非常感谢!