Matlab(二)——特殊语法笔记

发布于:2024-12-07 ⋅ 阅读:(138) ⋅ 点赞:(0)

本文是matlab(一)——基础语法小结的续篇

Magic Traits

1. 文件读取

fid = fopen(fn,'rt');
out = fscanf(fid,spec,inf);
fclose(fid);

2. 读取数据

fid = fopen(fn,'rt');
out = textscan(fid,spec);

3. 图像多列输出

vecn1 = [vecns{1}, vecns{2}, vecns{3}];
vecn2 = [vecns{4}, vecns{5}, vecns{6}];
vecn3 = [vecns{7}, vecns{8}, vecns{9}];
vecn4 = [vecns{10}, vecns{11}, vecns{12}];
combinedvecns = [vecn1; vecn2; vecn3; vecn4]; 
imshow(combinedvecns);
imwrite(combinedvecns, 'normal_vector.png');
  • 用;分割列

4. 文件写入

  • matlab写入文件如果已存在,不会默认覆盖,因此必须手动删除;
	% 路径要对应
    delete(strcat(dataName, '_Normal.mat'));
    imwrite(uint8(Normal*255).*uint8(mask3), strcat(dataName, '_Normal.png'));
  • 可用通配符删除
	delete('*.txt');

在 MATLAB 中,saveimwrite 是两个用于不同目的的函数,它们的主要区别如下:

1. save 函数

  • 用途save 函数用于将工作空间中的变量保存到一个 MAT 文件中。MAT 文件是 MATLAB 的专有格式,可以存储多种数据类型,包括数组、结构体、单元格数组等。
  • 语法
    save('filename.mat'); % 保存所有变量
    save('filename.mat', 'var1', 'var2'); % 只保存指定的变量
    
  • 文件格式:保存为 .mat 文件,适合于后续在 MATLAB 中加载和使用。

2. imwrite 函数

  • 用途imwrite 函数用于将图像数据写入文件。它可以将图像保存为多种格式,如 PNG、JPEG、TIFF 等。
  • 语法
    imwrite(imageData, 'filename.png'); % 保存图像数据为 PNG 格式
    imwrite(imageData, 'filename.jpg', 'Quality', 90); % 保存为 JPEG 格式并设置质量
    
  • 文件格式:支持多种图像格式(如 PNG、JPEG、TIFF 等),适合于图像处理和显示。

总结

  • save:用于保存 MATLAB 工作空间中的变量,生成 .mat 文件,适合于数据存储和后续分析。
  • imwrite:用于将图像数据保存为图像文件,支持多种图像格式,适合于图像处理和输出。

根据你的需求选择合适的函数。如果你想保存数据以便后续在 MATLAB 中使用,使用 save;如果你想将图像保存为文件以便查看或分享,使用 imwrite

运算篇

  1. fprintf(" xxx %d",a),当a为数组时,会输出数组数目行,每行是一个元素+相关文本的copy
  2. index: b(i,j,k,:);
  3. [1,1,5]->[5]: squeeze(a);
  4. [5]->[1,5]/[5,1]: reshape(a,[1,5]);
  5. minimal square solution:
% solution1
	c=A\b
% solution2
	A_=pinv(A)
	c=A_*b
  1. test struct in matlab
% assum data be a struct
disp(['data=',class(data)]);
disp(fieldnames(data));
disp(data);
  1. 对数列,会自动略去末尾的1维度,但之前的不会
>> b=reshape(a,[3,4,3,1,2,1])
>> size(b)
ans =
     3     4     3     1     2
  1. 获取多维数列的最大值
  • 整体最大值
b = max(a(:))
  • 获取某行某列最大值

  1. 终端输入匹配
  • 终端读取文本转为数字
drop = input('drop highlight and shadows?(0/1)');
if int32(drop) == 0
  • 数字(含浮点数)转字符串
num = 123;
num = 3.14;
str = num2str(num);

银河-睿智的矩阵索引

  • 与torch、numpy不同,matlab索引不是先排列最后一维,再排列倒数第二维,
  • 反过来先派列第一维,再排列第二维,直到最后一维;

看个例子💐

>> a= rand(2,3,4)
a(:,:,1) =
    0.7094    0.2760    0.6551
    0.7547    0.6797    0.1626
a(:,:,2) =
    0.1190    0.9597    0.5853
    0.4984    0.3404    0.2238
a(:,:,3) =
    0.7513    0.5060    0.8909
    0.2551    0.6991    0.9593
a(:,:,4) =
    0.5472    0.1493    0.8407
    0.1386    0.2575    0.2543
  • 依次排列(2)->(2,3)->(2,3,4)维度
  • 所以a(7)在3个维度的下标为(1,1,2)——(2-1)*2*3+(1-1)*2+1,对应0.1190
  • 而不是(1,2,3)—(1-1)*2*3+(2-1)*4+3,在numpy中为(0,1,2),
>> a(7)
ans =
    0.1190

. *与.*

在 MATLAB 中,*.* 是两种不同的运算符,它们用于不同类型的乘法运算。

  1. *(矩阵乘法)

    • * 运算符用于执行矩阵乘法。它遵循线性代数的规则,要求第一个矩阵的列数等于第二个矩阵的行数。
    • 例如,如果 A 是一个 m x n 矩阵,B 是一个 n x p 矩阵,则 C = A * B 将生成一个 m x p 矩阵。
    A = [1 2; 3 4];
    B = [5; 6];
    C = A * B; % C = [17; 39]
    
  2. .*(逐元素乘法)

    • .* 运算符用于执行逐元素乘法。它对两个同样大小的矩阵或数组的对应元素进行乘法运算。
    • 例如,如果 AB 都是 m x n 矩阵,则 C = A .* B 将生成一个同样大小的矩阵 C,其中每个元素 C(i,j) = A(i,j) * B(i,j)
    A = [1 2; 3 4];
    B = [5 6; 7 8];
    C = A .* B; % C = [5 12; 21 32]
    

总结:

  • 使用 * 进行矩阵乘法,要求矩阵维度匹配。
  • 使用 .* 进行逐元素乘法,要求两个操作数的维度相同。

贴士

但当两个输入有一个是整数时

b=a.*(-1)

等价于

b=a*(-1)

数组[]中,与;的区别

  • 比如用于图像多列输出

在 MATLAB 中,[] 用于创建数组或矩阵,而 ,; 在这个上下文中有不同的含义,分别用于控制数组的维度和结构。以下是它们的主要区别:

1. , - 列连接

  • 用于水平连接:在 [] 中使用 , 表示将多个元素或数组水平连接(即在同一行中)。
  • 创建行向量:如果在 [] 中使用 ,,则创建一个行向量。

示例

% 创建行向量
rowVector = [1, 2, 3]; % 返回 [1 2 3]

% 水平连接两个行向量
A = [1, 2, 3];
B = [4, 5, 6];
C = [A, B]; % 返回 [1 2 3 4 5 6]

2. ; - 行连接

  • 用于垂直连接:在 [] 中使用 ; 表示将多个元素或数组垂直连接(即在不同的行中)。
  • 创建列向量:如果在 [] 中使用 ;,则创建一个列向量。

示例

% 创建列向量
columnVector = [1; 2; 3]; % 返回 [1; 2; 3]

% 垂直连接两个列向量
A = [1; 2; 3];
B = [4; 5; 6];
C = [A; B]; % 返回 [1; 2; 3; 4; 5; 6]

结合使用 ,;

您可以在同一个 [] 中结合使用 ,; 来创建更复杂的矩阵。例如:

% 创建一个 2x3 的矩阵
matrix = [1, 2, 3; 4, 5, 6]; % 返回一个 2x3 的矩阵

在这个例子中:

  • 第一行是 1, 2, 3(使用 , 连接)。
  • 第二行是 4, 5, 6(使用 , 连接),并且行与行之间使用 ; 连接。

总结

  • ,:用于在同一行中连接元素或数组,创建行向量。
  • ;:用于在不同的行中连接元素或数组,创建列向量。

通过合理使用 ,;,您可以灵活地构建所需的数组和矩阵。

  1. 平方
b = a^2

按索引取数与maxk

程序如下:

A = zeros(sample_num,3);
...
[temp_array, temp_indice] = maxk(b(i,j,k,:),temp_num);
temp_array = squeeze(temp_array);
temp_indice = squeeze(temp_indice);
[b_resevoir(i,j,k,:), indice_resevoir(i,j,k,:)] = mink(temp_array, resevoir_num);
...
pA= pinv(A);
lA = pA(:,indice_resevoir(i,j,k,:));

shortcuts keys

  1. 查找+替换:ctrl+H
  2. 反注释:ctrl+T
  3. cut:ctrl+W

网站公告

今日签到

点亮在社区的每一天
去签到