本文是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 中,save
和 imwrite
是两个用于不同目的的函数,它们的主要区别如下:
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
。
运算篇
- fprintf(" xxx %d",a),当a为数组时,会输出数组数目行,每行是一个元素+相关文本的copy
- index: b(i,j,k,:);
- [1,1,5]->[5]: squeeze(a);
- [5]->[1,5]/[5,1]: reshape(a,[1,5]);
- minimal square solution:
% solution1
c=A\b
% solution2
A_=pinv(A)
c=A_*b
- test struct in matlab
% assum data be a struct
disp(['data=',class(data)]);
disp(fieldnames(data));
disp(data);
- 对数列,会自动略去末尾的1维度,但之前的不会
>> b=reshape(a,[3,4,3,1,2,1])
>> size(b)
ans =
3 4 3 1 2
- 获取多维数列的最大值
- 整体最大值
b = max(a(:))
- 获取某行某列最大值
- 终端输入匹配
- 终端读取文本转为数字
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 中,*
和 .*
是两种不同的运算符,它们用于不同类型的乘法运算。
*
(矩阵乘法):*
运算符用于执行矩阵乘法。它遵循线性代数的规则,要求第一个矩阵的列数等于第二个矩阵的行数。- 例如,如果
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]
.*
(逐元素乘法):.*
运算符用于执行逐元素乘法。它对两个同样大小的矩阵或数组的对应元素进行乘法运算。- 例如,如果
A
和B
都是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
(使用,
连接),并且行与行之间使用;
连接。
总结
,
:用于在同一行中连接元素或数组,创建行向量。;
:用于在不同的行中连接元素或数组,创建列向量。
通过合理使用 ,
和 ;
,您可以灵活地构建所需的数组和矩阵。
- 平方
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
- 查找+替换:ctrl+H
- 反注释:ctrl+T
- cut:ctrl+W