octave学习

前置安装
octave
introduction

clear; close all; clc刷新清空octave
如果写程序后缀名.m
help commandname帮助
;用法同c++
%注释
不再命令行而是直接编代码时,每句结尾; (在命令行用的话可以避免输出不必要的信息)
~=不等于
次方是^不是**
异或是xor(a,b)
e, pi, i都有定义
sin, cos, tan, log, exp, abs, floor, ceil
log\(e\)为底
printf, sprintf用法大致同c++, 不过sprintf最开头的目标变量参数去掉了变成返回值了
disp(x)显示值
没有//,且/默认可以是小数
pause等待输入
...放行末,将语句分几行写

变量

who显示当前已有变量, whos还能额外显示每个变量的size,bytes,数据类型
clear xxx删除变量

矩阵

定义:
A=[1,2,3;1,2,3;1,2,3]分号换行

访问:
A(1, 2)第一行第二列(可修改)
A(1, :)第一行整行 (类似numpy)
A(:, 2)整个第二列
vec(3:end)获得向量第三个元素到最后一个元素

一些构造函数:
1:5等价于[1, 2, 3, 4, 5]
1:2:5等于1 3 5(中间那个是步长)
zeros(n,m)nm的全零矩阵
ones(n,m) n
m的全一矩阵
A=eye(n)n*n单位矩阵
rand(n,m), randn(n,m)随机矩阵,rand是0到1随机小数,randn按均值为0方差为1的正态分布
A=zeros(size(B))构造相同大小的矩阵
可以A=[]开个不定大小的的矩阵,然后用[A, [1, 2]]这种来进而确定大小
也可用A(:,id)=[]删掉矩阵某一列

一些矩阵运算:
取逆inv(A) (如果sigular,那么pinv可以求伪逆)
转置A'
A.*B矩阵对应位乘
A.^B对应位的变为a^b
还有2.^AA.^2, exp(A), log(A), max(A, 2), A>2等也是每个位操作将运算结果换上去

其他函数
A=[A;B]把列数相同的矩阵B插入到A矩阵下面
A=[A,B]把行数相同的矩阵B插入到A矩阵右边
length(A)获得向量长度
size(A)返回二元组(几行,几列)(size(A, 1/2)分别是获取二元组的第1第2个值)
max(A): 当\(A\)为行/列向量时,求最大值。 而当\(A\)为矩阵时,会默认得到一个对应每列最大值的行向量。
当对向量操作时,[val, ind] = max(A)可以额外获得下标
max(A,[],1或2)则不管你是否向量,1是求每列最大值的行向量, 2是求每行最大值的列向量
sum(A, 1或2)1是每列和摆成行向量,2是每行和摆成列向量
要求整个矩阵最大值或整个矩阵的和的话max(max(A)), sum(sum(A))
prod乘法同理
对向量find(A>3)找出满足条件的下标,对矩阵[r,c]=find(A>3)找到满足条件的下标
mean求平均数
std求标准差

A(:)是一种矩阵转向量的问题,可用于简化上述求整个矩阵的和,乘积,最大值

绘图

x=[-2:0.01:2]; %定义域(取点频率是每0.01一个)
y=x.^2; %函数
plot(x, y); %绘出图像(是将相邻的点用直线连起来的)
print -dpng "foo.png"; %dpng djpg ... 将最近一次plot保存为文件,会保存到源文件所在目录(命令行弄了一下不行?)

xlable("name"),ylabel("name")设置坐标轴变量名称
axis([xa,xb, ya, yb])设置坐标系显示范围(注意这并不回改变你函数的定义域,只是类似于你换了个观察角度而已)
title("name")图标上方名称
legend("name1", "name2")按照图上曲线创建顺序标上图示(右上角显示红线时name1,蓝线是name2这种)
cloes关闭当前figure

默认创建的临时窗口写着Figure 1。 可用figure(number)来控制打开叫什么名字的临时窗口,以便同时作画多张图片
subplot(n,m,idx)是把当前figure平均分成\(n*m\)的网格状后,从上往下一行一行从左往右数的第idx个网格处放置一个网格大小的坐标系占位置
然后之后的画图就会画在那里,直到你切换subplot
切换subplot不会覆盖原来在那的坐标系,也不会重置hold off
用不同划分方式的subplot往空白的地方放可以使一个figure上有不同大小的坐标系
但如果不同划分方式的subplot与之前放过的subplot有重合,就会把之前的那个铲掉
hold on函数使新函数不覆盖旧函数 hold off取消.
hold on作用区域是局部的, 具体是作用于subplot(一个figure看作1*1的subplot)
当你没有打开figure时,回帮你开个figure1并帮你设置它为hold on。
这样写在最靠外不代表什么全局设置之类的,你figure(2)这样2是没有hold on的
当你的subplot被新建时,默认时hold off的(从刚打开的空白一片连坐标系都没有的figure中开subplot也是如此)
当figure关闭后再打开,相当于新建subplot,默认hold off

作图实虚线,颜色,空心圆等符号,参考

hist(A)将向量A中的数字统计出现次数并绘成直方图一个数值的柱的右边界是那个数值,而不是柱子中间对着数值。所以显得比较奇怪
hist(A,w)后面那个参数越大,柱就越细

矩阵转灰度图imagesc(A), colorbar, colormap grey

与外界联动

load('filename')里面的东西得是像矩阵这种合法的格式
如果这样写load("a.txt")默认会去掉后缀把文件名作为新的变量名存起来,这可能会覆盖掉a原有的变量值
可以这样b=load("a.txt")指定存储位置,不会覆盖a

save file variable可以将某个变量存进去
save file则是把所有变量存进去
以后可以load file这时载入的变量名与原来保存时相同
注意这里不要用b=load("a.txt"),否则首先b存多个变量不知道怎么访问,其次这样子b是只读的

条件语句,循环

for i = 1:10,while i<10没有冒号
注意上面那句话本质就是for i = vector
最后要用end;收尾

if , else不用冒号
elseif中间没有空格
最后要用end;收尾

function

function f()无返回值不用写返回值,无参数参入可以不写括号
function res = f(arg-list) 单返回值型 (相当于res是函数里的临时变量)
function [res1, res2] = f(arg-list) 并不是真的返回list
不能写成A=f(...)这样A只能得到res1,必须写成[a, b] = f(...)
end
可以另写文件,一个.m文件存一个函数,如果文件名不等于函数名,则函数名会变成文件名,但这样会warning
也就是说建议文件名和函数名一样吧。
这样使用函数需要cd到.m文件的目录,或者打addpath("directory")

关于矩阵乘法的思考

向量对应乘求和的两种方式:\(u'*v\)\(sum(u.*v)\)

单组数据是 A列向量 时,多组数据就一列一列排起来,结果也对应是按原来结果的格式一列一列排起来
但组数据时 行向量
A 时,多组数据就一行一行拍起来,结果也对应是按原来结果的格式一行一行排起来

posted @ 2019-06-12 09:25  _zwl  阅读(666)  评论(0编辑  收藏  举报