matlab中数组、矩阵、cell

内容提要:
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,主要是注意相对位置决定值,而不是名字
  • 2
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值