内容提要:
1.创建和初始化
2.动态赋值和扩展
3. 引用
4. 赋值
5. 其他
注意:
cell有1*4double和1*4cell的,对于前者可以用普通的圆括号和大括号进行引用,对于后面的引用就比较困难了。
数组:
1.动态数组的使用
https://zhidao.baidu.com/question/67076146.html
A=[];
A(1)=2;
A(2)=3;
A(3)=7;
x=[1,2,3]
x(2) %矩阵就是这样引用的
对于字符串数组同样食用
X=['1,2,3']
x(1)
多维数组的应用
1.矩阵的增加和减少
a=[1 1;2 2];
a=[a [3;3]]
a=[a [3;3]] %矩阵的增加 其实就是两个相同维度的矩阵的简单拼接我感觉
a(:,1)=[] %减少第一列的矩阵
2.定义多维空矩阵
A=[]即可
3.由低维数组创建高维数组
https://jingyan.baidu.com/article/5225f26b0a6650e6fa0908ea.html
D2=[1,2,3;4,5,6;7,8,9];
C=cat(3,D2,2*D2,3*D2)
4.最后折衷了一下
https://wenku.baidu.com/view/78cec1f7f61fb7360b4c6509.html
5.多维矩阵就是这样慢慢建立的吗?厉害了
A=[1,2,3;4,5,6];
A(:,:,2)=ones(2,3); %表示增加了一维度 然后重新建了一个矩阵
A
但是我这么做
A=ones(1,5)
A(:,:,2)=ones(1,5); %表示增加了一维度 然后重新建了一个矩阵
A
改为
A(:,2)=ones(1,5); 这里却失败了 我觉得原因是因为这是矩阵的缘故
6.最终方案
A=ones(1,5);
A(:,:,2)=ones(1,5); %表示增加了一维度 然后重新建了一个矩阵
A(:,:,3)=A(:,:,2);
X=A(:,:,3)
7.最终方案一定就是这个了
A=ones(1,5);
A(:,:,2)=ones(1,5); %表示增加了一维度 然后重新建了一个矩阵
A(:,:,3)=A(:,:,2);
X=A(:,:,3);
b=A(1,5,3)
A
矩阵:矩阵是方形的数值型的数组,所以可以由一些函数生成,其他的应用方式则和矩阵式一样的
cell:
1 动态cell
a = [1 2 3]; b = [4 5 6 7 8]; c= [10 11];
d ={}; d{1}=a; d{2}=b; d{3}=c;
celldisp(d)可以用来显示元胞数组d;
赋初值的方法主要是这两种
1.obstacle={38.5 23.5 6 6;40-3.0/2 25-3.0/2 3 3}; 或者中间用逗号
2 用变量
x=[1,2,3];
y=[3,2,3];
obstacle={x,y};
3.cell的引用(大括号和圆括号不)
跟普通的三维数组是一样的,但是要注意用大括号
如果里面只有一个数字,它会采取行优先类似的计数方法x1=obstacle{1};
圆括号引用法 :x1=obstacle(1,:); 可以得到一组值
x1=obstacle{1,:}; 这种方法是错误的
C = 2x2 cell array
{1x3 double} {1x3 double}
{1x2 cell } {1x1 struct}
使用大括号 {} 访问特定元胞的完整内容。例如,从包含某个数值向量的元胞返回该向量。
C{1,2}
ans =
100 200 300
批量赋值 bb(ii,:)=ss(end-19:end-1);
4.数组和cell互转
数组存到cell中之后,再访问的时候就变成cell了,用这种方法将再次得到矩阵
x=[40 25 3 3];
y=[40 25 3 3];
obstacle={x,y}; 矩阵转为cell=2*4double
z=[obstacle(1)]
numericVector = cell2mat(z);
all=dataread_all('input.txt');
num=cell2mat(all(1,3)); %得到障碍物的数量 将cell转换为数组
```
```
5.我的方案失败的原因是在这里,getline将空格变成了逗号,就是把任何东西都读为字符串,以逗号隔开
显示:
1×1 cell 数组
{1×3 cell}
1×3 cell 数组
{'25,25,10,10,0'} {'12,42,4,4,1'} {'46,14,8,8,1'}
这表示cell里面的元素还是cell,相当于里面是字符串,可以进一步的调用,但是已经是字符串了,逗号也是一个元素
1×2 cell 数组
{1×5 double} {1×5 double}
这表示cell里面的元素是double
给一个完整的解释
obstacle =
1×3 cell 数组
{'25,25,10,10,0'} {'12,42,4,4,1'} {'46,14,8,8,1'}
b2 =
1×2 cell 数组
{1×1 cell} {1×1 cell}
all =
1×10 cell 数组
{'50,50'} {'41,26,3,3'} {[3]} {1×3 cell} {[6]} {1×6 cell} {'20,40'} {'3'} {'250'} {'5'}
首先我发现cell只显示第一层次,b2里面有两层所以只显示一层
其次由obstacle可发现,后面的都是一个整体没有层次结构
7.下面一个有意思得例子,说明了从cell到数值其实还有通过手写来实现的方式进行引用
据说。cell2mat只能适合元胞数组是n*n维的情况,我最近也遇到了这个问题,如下的程序可能会帮到你
% 将数字字符元胞数组转化成double
cell_str_list = {'1 2 3 4 5 6'; '1 3 4'};
a_str = char(cell_str_list);
a_str = a_str.';
a_str = (a_str(:)).';
b_str='';
for ii=1:length(a_str)
b_str=strcat(b_str,strtok(a_str(ii))); %strtok除去分隔符
end
b_str;
for ii=1:length(b_str)
b_double(ii)=str2double(b_str(ii));
end
b_double;
8.如果中间隔得是逗号,那么就是一个字符串了,现在是1*6个字符串(我的方案就是变成了一字符串)
字符串到double
a={'1.025000e-06' '1.050000e-06' '1.075000e-06' '1.100000e-06' '1.125000e-06' '1.150000e-06'};
num=length(a);
for ii=1:num
b(ii)=str2double(a{1,ii});
end
b
8.最终的解决方案 没有解决 居然连逗号也包括在里面了
all=dataread_all('input.txt');
num=cell2mat(all(1,3)); %得到障碍物的数量 这个元素很凑巧,因为它碰巧只有一个字符
obstacle1=all(1,4)
o1=obstacle1{1,1}
o2=o1{1,1}
% anss=str2double(o2) %得到252510100
9
注意字符型cell和字符串型的cell的差别
a={'1','2','3','4'}
a =
1×4 cell 数组
{'1'} {'2'} {'3'} {'4'}
a={1,2,3,4,5}
a =
1×5 cell 数组
{[1]} {[2]} {[3]} {[4]} {[5]}
这个例子是想说明,cell的最小单位不是字符,所以返回的是整个字符串,然后字符串的最小单位是字符
a2 =
1×1 cell 数组
{'1,2,3,4,5'}
a2{1,1}=
'1,2,3,4,5'
a211(1,1)='1'
12 最后的最后采取的方法是
将每一行都用table读取进来,然后用table进行访问
function input1 = importfile2(filename)
%IMPORTFILE2 将文本文件中的数值数据作为矩阵导入。
% INPUT1 = IMPORTFILE2(FILENAME) 读取文本文件 FILENAME 中默认选定范围的数据。
%
% INPUT1 = IMPORTFILE2(FILENAME, STARTROW, ENDROW) 读取文本文件 FILENAME 的
% STARTROW 行到 ENDROW 行中的数据。
%
% Example:
% input1 = importfile2('input.txt', 1, 17);
%
% 另请参阅 TEXTSCAN。
% 由 MATLAB 自动生成于 2018/03/30 10:09:33
%% 初始化变量。
delimiter = ',';
if nargin<=2
startRow = 1;
endRow = inf;
end
%% 每个文本行的格式:
% 列1: 双精度值 (%f)
% 列2: 双精度值 (%f)
% 列3: 双精度值 (%f)
% 列4: 双精度值 (%f)
% 列5: 双精度值 (%f)
% 有关详细信息,请参阅 TEXTSCAN 文档。
formatSpec = '%f%f%f%f%f%[^\n\r]';
%% 打开文本文件。
fidin = fopen(filename,'r');
fileID = fopen(filename,'r');
nline = 0;
while ~feof(fidin) %判断是否为文件末尾
nline = nline+1;
fgetl(fidin);
end
endRow=nline;
%% 根据格式读取数据列。
% 该调用基于生成此代码所用的文件的结构。如果其他文件出现错误,请尝试通过导入工具重新生成代码。
dataArray = textscan(fileID, formatSpec, endRow(1)-startRow(1)+1, 'Delimiter', delimiter, 'TextType', 'string', 'EmptyValue', NaN, 'HeaderLines', startRow(1)-1, 'ReturnOnError', false, 'EndOfLine', '\r\n');
for block=2:length(startRow)
frewind(fileID);
dataArrayBlock = textscan(fileID, formatSpec, endRow(block)-startRow(block)+1, 'Delimiter', delimiter, 'TextType', 'string', 'EmptyValue', NaN, 'HeaderLines', startRow(block)-1, 'ReturnOnError', false, 'EndOfLine', '\r\n');
for col=1:length(dataArray)
dataArray{col} = [dataArray{col};dataArrayBlock{col}];
end
end
%% 关闭文本文件。
fclose(fileID);
fclose(fidin);
%% 对无法导入的数据进行的后处理。
% 在导入过程中未应用无法导入的数据的规则,因此不包括后处理代码。要生成适用于无法导入的数据的代码,请在文件中选择无法导入的元胞,然后重新生成脚本。
%% 创建输出变量
input1 = table(dataArray{1:end-1}, 'VariableNames', {'VarName1','VarName2','VarName3','VarName4','VarName5'});
其他一些乱七八糟的
11.一个例子留着学习
clear;
fid=fopen('D:\学习\网站.txt','r');
ss=fgets(fid);
ii=1;
while (length(ss)~=1)
bb(ii,:)=ss(end-19:end-1);
ii=ii+1;
ss=fgets(fid);
end
bb里面存储的就是提取出来的日期时间
13.矩阵(也叫数组)和cell的区别
x={'','10'} 这样定义的是一个cell 其中第一个是一个空cell
x=[','10']
x={'','10'}
x{1,2}
x(2)
这就是两种访问方式
14 批量赋初值的问题,这样得到是9个double 0一个cell ‘10’
y={};
y{1,10}='10';
y
手写了一个很low的不知道能不能解决问题
clc;
y={};
for i=1:50
if i%10==0
y{1,10}='10';
else
y{1,10}='';
end
end
最后的解决方案
clc;
y={};
for i=1:50
if mod(i,10)== 0
y{1,10}='10';
else
t='';
y{1,i}=t;
end
end
唉,没办法,只能暴力解决了
15.字符串转换函数
用num2str函数,可以用help+nim2str查看帮助!
>> A=[1,1,2,2,3,3]
A =
1 1 2 2 3 3
>> B=num2str(A)
B =
1 1 2 2 3 3
>> class(B)
一个函数的使用问题
[m,y]=dis(x)
调用的时候可以这样 [y m]=dis(x) ,或者dis(x)它会默认得到y m,主要是注意相对位置决定值,而不是名字