有谁知道如何计算值出现在矩阵中的次数?
例如,如果我有一个1500 x 1矩阵M(向量)存储工作日的值(1 - 7),我怎么能计算星期日(1),星期一(2),...,星期六(7)的数量存储在M?
这个问题产生于我在进一步调查这个问题后发现的一些奇怪的事情......
我总是将MATLAB变量理解为默认的双精度.所以,如果我要做一些事情,比如声明一个小数点后20位数的变量:
>> num = 2.71828182845904553488;
>> class(num) % Display the variable type
ans =
double
Run Code Online (Sandbox Code Playgroud)
我希望忽略最后4位数,因为浮点相对精度大约为10 -16:
>> eps(num)
ans =
4.440892098500626e-016
Run Code Online (Sandbox Code Playgroud)
如果我尝试在小数点后面显示超过16位的数字(使用fprintf或者sprintf),我得到的结果是:
>> fprintf('%0.20f\n', num)
2.71828182845904550000
>> sprintf('%0.20f', num)
ans =
2.71828182845904550000
Run Code Online (Sandbox Code Playgroud)
换句话说,数字17到20都是0.
但是,事情变得奇怪,当我传球num给可变精度算术函数的符号工具箱,告诉它表示使用的精度21个的位数:
>> vpa(num, 21)
ans =
2.71828182845904553488
Run Code Online (Sandbox Code Playgroud)
什么?!最后4位数字再次出现!当我输入的原始数字存储为双精度变量时,它们是否应该丢失num?既然num传递给它是一个双精度变量vpa,怎么vpa知道它们是什么?
我最好的猜测是,MATLAB内部表示的num精度高于双精度,因为我将它初始化为一个数字,其数字超过小数点,而不是双精度变量可以处理的数字.这真的是发生了什么,还是正在发生的事情?
奖励:如果你还没有上述的偏头痛,这里还有另外一个混乱的根源......
>> num = 2.71828182845904553488; % Declare …Run Code Online (Sandbox Code Playgroud) 是否有内置的MATLAB函数来确定矩阵是否包含某个值?(ala PHP的in_array())
我的问题很容易归纳为:"为什么以下不起作用?"
teststruct = struct('a',3,'b',5,'c',9)
fields = fieldnames(teststruct)
for i=1:numel(fields)
fields(i)
teststruct.(fields(i))
end
Run Code Online (Sandbox Code Playgroud)
输出:
ans = 'a'
??? Argument to dynamic structure reference must evaluate to a valid field name.
Run Code Online (Sandbox Code Playgroud)
特别是因为teststruct.('a') 确实有效.并fields(i)打印出来ans = 'a'.
我无法理解它.
我正在编写一个程序,我需要删除存储在矩阵中的重复点.问题在于,当检查这些点是否在矩阵中时,MATLAB不能在矩阵中识别它们,尽管它们存在.
在以下代码中,intersections函数获取交集点:
[points(:,1), points(:,2)] = intersections(...
obj.modifiedVGVertices(1,:), obj.modifiedVGVertices(2,:), ...
[vertex1(1) vertex2(1)], [vertex1(2) vertex2(2)]);
Run Code Online (Sandbox Code Playgroud)
结果:
>> points
points =
12.0000 15.0000
33.0000 24.0000
33.0000 24.0000
>> vertex1
vertex1 =
12
15
>> vertex2
vertex2 =
33
24
Run Code Online (Sandbox Code Playgroud)
应从结果中消除两点(vertex1和vertex2).它应该通过以下命令完成:
points = points((points(:,1) ~= vertex1(1)) | (points(:,2) ~= vertex1(2)), :);
points = points((points(:,1) ~= vertex2(1)) | (points(:,2) ~= vertex2(2)), :);
Run Code Online (Sandbox Code Playgroud)
在这之后,我们有了这个意想不到的结果:
>> points
points =
33.0000 24.0000
Run Code Online (Sandbox Code Playgroud)
结果应该是一个空矩阵.如你所见,第一对(或第二对)[33.0000 24.0000]已被淘汰,但不是第二对.
然后我检查了这两个表达式:
>> points(1) ~= vertex2(1)
ans …Run Code Online (Sandbox Code Playgroud) 我需要从MATLAB调用Python函数.我怎样才能做到这一点?
如果您的DPI超过150的显示器(例如Macbook Pro),您可能也会发现问题:Java Swing应用程序上的字体对于高DPI显示器来说太小了,我根本无法更改字体大小(It直接忽略Windows DPI,仅显示非常原始的DPI - > 96).除了改变屏幕分辨率,我什么也做不了,这绝对会让LCD上的一切变得模糊.
是的,我有一台带有高DPI显示器的笔记本电脑,分辨率为1920x1080的15.6英寸笔记本电脑,笔记本电脑上的一些Java桌面应用程序看起来很小,比如Matlab,Burpsuite等.我一直在互联网上搜索很长时间,但是仍然找不到问题的方法.我知道我可以通过改变JRE字体JRE_HOME/lib/font/fontconfig.properties.src,但我找不到任何地方来设置Java桌面字体的默认字体大小或DPI.
问题没有解决方案吗?你有一台高DPI显示器吗?你如何处理这些应用程序?Swing是否会放弃高DPI用户?
我有一个函数,它将可选参数作为名称/值对.
function example(varargin)
% Lots of set up stuff
vargs = varargin;
nargs = length(vargs);
names = vargs(1:2:nargs);
values = vargs(2:2:nargs);
validnames = {'foo', 'bar', 'baz'};
for name = names
validatestring(name{:}, validnames);
end
% Do something ...
foo = strmatch('foo', names);
disp(values(foo))
end
example('foo', 1:10, 'bar', 'qwerty')
Run Code Online (Sandbox Code Playgroud)
似乎在提取适当的值时需要付出很多努力(并且它仍然不是特别强大的再次严格指定的输入).有没有更好的方法来处理这些名称/值对?是否有MATLAB附带的辅助函数可以提供帮助?
我在matlab中有九个开放的数字(由另一个函数生成),我想将它们全部打印到文件中.有谁知道如何抓取MATLAB中所有开放数字的句柄?
我知道,gcf但它似乎没有做我想要的.
我偶然发现了Matlab处理空矩阵的奇怪方式(在我看来).例如,如果两个空矩阵相乘,则结果为:
zeros(3,0)*zeros(0,3)
ans =
0 0 0
0 0 0
0 0 0
Run Code Online (Sandbox Code Playgroud)
现在,这已经让我感到惊讶,然而,快速搜索让我进入上面的链接,我得到了解释为什么会发生这种情况的一些扭曲的逻辑.
但是,没有任何事情让我为以下观察做好准备 我问自己,这种类型的乘法与使用zeros(n)函数的效率有多高,比如初始化的目的?我以前timeit回答这个问题:
f=@() zeros(1000)
timeit(f)
ans =
0.0033
Run Code Online (Sandbox Code Playgroud)
VS:
g=@() zeros(1000,0)*zeros(0,1000)
timeit(g)
ans =
9.2048e-06
Run Code Online (Sandbox Code Playgroud)
两者都有1000x1000类零的矩阵相同的结果double,但空矩阵乘法1的速度快〜350倍!(使用ticand toc和循环发生类似的结果)
怎么会这样?是timeit或是tic,toc虚张声势还是我找到了一种更快速的方法来初始化矩阵?(这是用matlab 2012a完成的,在win7-64机器上,intel-i5 650 3.2Ghz ...)
编辑:
在阅读了您的反馈之后,我更仔细地研究了这个特性,并在2台不同的计算机上进行了测试(同样的matlab ver,尽管2012a),这是一个检查运行时间与矩阵n大小的代码.这就是我得到的:

生成此代码的代码与timeit之前一样使用,但循环使用tic并且toc看起来相同.因此,对于小尺寸,zeros(n)是可比的.然而,围绕n=400空矩阵乘法的性能有所提升.我用来生成该图的代码是:
n=unique(round(logspace(0,4,200)));
for k=1:length(n)
f=@() zeros(n(k));
t1(k)=timeit(f);
g=@() zeros(n(k),0)*zeros(0,n(k));
t2(k)=timeit(g);
end
loglog(n,t1,'b',n,t2,'r');
legend('zeros(n)','zeros(n,0)*zeros(0,n)',2);
xlabel('matrix size …Run Code Online (Sandbox Code Playgroud)