标签: matlab

如何计算矩阵中给定值的元素数?

有谁知道如何计算值出现在矩阵中的次数?

例如,如果我有一个1500 x 1矩阵M(向量)存储工作日的值(1 - 7),我怎么能计算星期日(1),星期一(2),...,星期六(7)的数量存储在M

matlab count matrix

72
推荐指数
4
解决办法
17万
查看次数

在MATLAB中,默认情况下变量是否真的是双精度?

这个问题产生于我在进一步调查这个问题后发现的一些奇怪的事情......

我总是将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)

variables floating-point precision matlab

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

'矩阵包含值X?'的函数

是否有内置的MATLAB函数来确定矩阵是否包含某个值?(ala PHP的in_array())

floating-point matlab function matrix

70
推荐指数
2
解决办法
11万
查看次数

迭代MATLAB中的struct fieldnames

我的问题很容易归纳为:"为什么以下不起作用?"

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 matlab-struct

69
推荐指数
3
解决办法
10万
查看次数

为什么在MATLAB中24.0000不等于24.0000?

我正在编写一个程序,我需要删除存储在矩阵中的重复点.问题在于,当检查这些点是否在矩阵中时,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)

应从结果中消除两点(vertex1vertex2).它应该通过以下命令完成:

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)

floating-point precision matlab

67
推荐指数
4
解决办法
2万
查看次数

从MATLAB调用Python函数

我需要从MATLAB调用Python函数.我怎样才能做到这一点?

python matlab language-interoperability

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

如何在Windows/Linux上设置Java Swing应用程序的DPI?

如果您的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用户?

java matlab fonts swing dpi

66
推荐指数
4
解决办法
5万
查看次数

如何在MATLAB中处理函数参数的名称/值对

我有一个函数,它将可选参数作为名称/值对.

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 arguments function name-value function-parameter

65
推荐指数
6
解决办法
4万
查看次数

如何获取MATLAB中所有开放数字的句柄

我在matlab中有九个开放的数字(由另一个函数生成),我想将它们全部打印到文件中.有谁知道如何抓取MATLAB中所有开放数字的句柄?

我知道,gcf但它似乎没有做我想要的.

matlab figures matlab-figure

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

通过空矩阵乘法更快地初始化数组的方法?(Matlab的)

我偶然发现了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)

performance matlab initialization matrix-multiplication

62
推荐指数
3
解决办法
4750
查看次数