matlab检查不匹配分隔符

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了matlab检查不匹配分隔符相关的知识,希望对你有一定的参考价值。

参考技术A 命令行窗口:
在打开matlab 后,我们首先看到就是这个界面,其中中间空白区就是最常用的命令行窗口,左侧是显示路径,右侧是工作区。

在命令行窗口内的 “ >> ”就是命令提示符,表示等待我们输入命令,输入命令后按enter执行。

新人在命令行窗口输入通常会有这几个问题

1.怎么换行。

用shift + enter

2.执行后没结果或者显示太多。

matlab 语句后加上“;”就表示不显示结果。

如图,a=3和c=a+b后有分号,执行后不会显示他们的值,但是可以在工作区可以看到值;b=3后不带分号,输出了它的值,而最后的a+b没有赋给变量,采用默认的ans表示。点击工作区可以查看变量。

此外用whos指令可以输出所有变量内容;whos + 具体变量名,输出具体某一变量。

3.未定义变量

用sym定义变量,多个变量用syms,中间以空格隔开。

4.之前画的图没了

matlab 画图是默认覆盖上一次绘图的,可以用hold on 保持图形。

5.表达式无效,检查不匹配的分隔符

一般是括号没对上,写命令时最好先打一对括号。

编辑器窗口:
我们可以直接点击新建脚本或者新建中再点脚本打开编辑器窗口,在编辑器中很重要功能就是进行程序调试。其中“ 运行” 需要将程序保存.m文件,而 “运行并前进 ”不需要保存可以直接运行,我就爱用这个(◔◡◔)。

最常用调试方法的就是注释与设置短点。注释就是在某一句前加上%,注释后语句会变成绿色,程序会 跳过 这一句执行;而设置短点是程序 执行完 这一句后停止,会在语句行数处出现一个红点。我们以同时画sin(x)与cos(x)为例,x设置在(0,2π)内,在第一个图中不做处理顺利画出两个函数图像;第二个图中,把画sin(x)语句注释,最后只呈现cos(x)的图像;第三个图中,在hold on语句设置断点,不会执行画cos(x)图像的语句,最后图像只呈现sin(x)。

常用三个c:
clear 清除所有变量

clc 清除命令行窗口内容

close 关闭图形窗口

没特殊要求就把clear 时常带上。

为啥matlab和python中的特征向量计算不匹配?

【中文标题】为啥matlab和python中的特征向量计算不匹配?【英文标题】:Why are eigenvector computations in matlab and python not matching?为什么matlab和python中的特征向量计算不匹配? 【发布时间】:2021-12-01 12:31:36 【问题描述】:

Matlab:

m1 = [ 333.33333333  83.33333333   0. ;  83.33333333 333.33333333  83.33333333 ;  0.   3.33333333 166.66666667]
k1 = [ 800. -400.    0.; -400.  800. -400.;   0. -400.  400.]
[vec, val] = eig(m1, k1)

vec =

   -0.0106   -0.0289    0.0394
    0.0183   -0.0000    0.0683
   -0.0211    0.0289    0.0789

蟒蛇:

import scipy
import numpy as np
m1 = np.array[[333.33333333,  83.33333333,  0.], [ 83.33333333, 333.33333333, 83.33333333], [0., 83.33333333, 166.66666667]]
k1 = np.array[[800., -400.,  0.], [-400.,  800., -400.], [0., -400.,  400.]]
val, vec = scipy.linalg.eig(m1, k1)

vec = 
[[ 3.53553391e-01, -7.07106781e-01,  3.53553391e-01], 
[ 6.12372436e-01,  1.88119544e-16, -6.12372436e-01], 
[ 7.07106781e-01,  7.07106781e-01,  7.07106781e-01]]

所以 matlab 和 python 特征向量vec 不匹配。 Matlab document 说

[V,D] = eig(A,B) 返回广义特征值的对角矩阵 D 和全矩阵 V,其列是对应的右 特征向量,所以A*V = B*V*D.

m1 * vec = k1 * vec * val 满足matlab 输出但不满足python 输出。如何使用 python、numpy 获得 matlab 给出的相似特征向量?

【问题讨论】:

我认为这个区别在之前的SO中已经讨论过了,虽然我没有太关注。看起来像两列的向量,但归一化是否相同?下单怎么样? np.linalg.eig 似乎有更完整的文档。 【参考方案1】:

特征向量不是唯一的;如果x 是一个特征向量,那么a * x 仍然是任何非零标量a 的特征向量。

看python和matlab的两个结果; matlab 中vec 的第一列看起来像python 中vec 第三列的缩放版本。 matlab 的第二列似乎是 python 的第二列的缩放版本(回忆1.88119544e-16 几乎为零)。第三列对应于第一列。所以我的猜测是matlab中的val是python中val的反转版本;我无法验证这一点,因为我现在没有 matlab,但你可以验证这一点。

同样在 python 中,请记住 * 是元素乘法(即,.* 在 matlab 中)。您可以使用@ 进行矩阵乘法。

import scipy.linalg
import numpy as np
m1 = np.array([[333.33333333,  83.33333333,  0.], [ 83.33333333, 333.33333333, 83.33333333], [0., 83.33333333, 166.66666667]])
k1 = np.array([[800., -400.,  0.], [-400.,  800., -400.], [0., -400.,  400.]])
val, vec = scipy.linalg.eig(m1, k1)

print(m1 @ vec)
print(k1 @ vec * val)

正如你在下面的输出中看到的,我们有相同的输出(虚部是0.j,所以你可以忽略它)。

输出:

[[ 1.68882167e+02 -2.35702260e+02  6.68200939e+01]
 [ 2.92512493e+02 -3.14270210e-09 -1.15735798e+02]
 [ 1.68882167e+02  1.17851130e+02  6.68200939e+01]]
[[ 1.68882167e+02+0.j -2.35702260e+02+0.j  6.68200939e+01+0.j]
 [ 2.92512493e+02+0.j -3.14263578e-09+0.j -1.15735798e+02+0.j]
 [ 1.68882167e+02+0.j  1.17851130e+02+0.j  6.68200939e+01+0.j]]

【讨论】:

以上是关于matlab检查不匹配分隔符的主要内容,如果未能解决你的问题,请参考以下文章

MATLAB——解数独

如何检查String是否与Groovy中的模式匹配

解析带有小数和分组分隔符的货币字符串,或者如果 Pattern 不匹配则抛出

Jmeter仪表板因管道分隔符jtl失败

matlab - 读取具有不同分隔符大小的表格

使用随机字符分隔符匹配 SQLite 中的数字序列