查看: 4511|回复: 9|关注: 0

[已解决] struct和cell的数据储存与读取问题

[复制链接]

新手

6 麦片

财富积分


050


1

主题

6

帖子

0

最佳答案
  1. function m=year2016(a)
  2. B=[1,3,5,7,8,10,12];
  3.     S=[4,6,9,11];
  4.     for i=B(1:end)
  5.         v(i).date(1:31)={i};
  6.         end
  7.         for i=S(1:end)
  8.         v(i).date(1:30)={i};
  9.     end
  10.     for i=2
  11.         v(i).date(1:29)={i};
  12.     end
  13.     m=v(a);
  14. end
复制代码



以上函数目标是将2016的每月日期填入v这个结构体。当我想用以下方式调用时,会出现错误:
A=year2016(1);
B=A(7);
为什么A不是一个1*31的struct,而是1*1的struct?
为什么B不是数字7呢?MATLAB报错:Index exceeds matrix dimensions.
回复主题 已获打赏: 0 积分

举报

新手

6 麦片

财富积分


050


1

主题

6

帖子

0

最佳答案
 楼主| 发表于 2016-9-15 18:13:44 | 显示全部楼层
请问我如果想要实现以下功能需要怎么赋值和调用呢?针对date(第二行)。
捕获.JPG
回复此楼 已获打赏: 0 积分

举报

MATLAB 基础讨论
版块优秀回答者

入门

93 麦片

财富积分


50500


5

主题

288

帖子

17

最佳答案
  • 关注者: 1
发表于 2016-9-15 21:06:21 | 显示全部楼层
请问这里的a是要做什么的??
回复此楼 已获打赏: 0 积分

举报

新手

6 麦片

财富积分


050


1

主题

6

帖子

0

最佳答案
 楼主| 发表于 2016-9-15 21:12:46 | 显示全部楼层
killerzheng 发表于 2016-9-15 21:06
请问这里的a是要做什么的??

a是我调用函数时输入的值,代表我想要的月份。
回复此楼 已获打赏: 0 积分

举报

MATLAB 基础讨论
版块优秀回答者

入门

93 麦片

财富积分


50500


5

主题

288

帖子

17

最佳答案
  • 关注者: 1
发表于 2016-9-15 21:35:16 | 显示全部楼层
本帖最后由 killerzheng 于 2016-9-15 21:41 编辑

  1. function m = year2016(a)
  2. B=[1,3,5,7,8,10,12];
  3. S=[4,6,9,11];
  4. L=2;
  5. Month = {'Jan','Feb','Mar','Apr','May','June','July','Aug','Sep','Oct','Nov','Dec'};
  6. Day   = {'Mon','Tues','Wed','Thu','Fri','Sat','Sun'};
  7. for i = B(1:end)
  8.     for j = 1:31
  9.         v{i}{j}.date = j;
  10.         v{i}{j}.month = Month{mod(i,13)};
  11.         day = mod(j,7);
  12.         if(day == 0)
  13.             day = 7;
  14.         end
  15.         v{i}{j}.day   = Day{day};
  16.     end
  17. end
  18. for i = S(1:end)
  19.     for j = 1 : 30
  20.         v{i}{j}.date = j;
  21.         v{i}{j}.month = Month(mod(i,13));
  22.         day = mod(j,7);
  23.         if(day == 0)
  24.             day = 7;
  25.         end
  26.         v{i}{j}.day   = Day{day};
  27.     end
  28. end
  29. for i = L(1:end)
  30.     for j = 1 : 29
  31.         v{i}{j}.date = j;
  32.         v{i}{j}.month = Month(mod(i,13));
  33.         day = mod(j,7);
  34.         if(day == 0)
  35.             day = 7;
  36.         end
  37.         v{i}{j}.day   = Day{day};
  38.     end
  39. end
  40. m = v{a};
复制代码


运行
  1. B = year2016(5);
  2. B{10}
复制代码

结果
  1. ans =

  2.      date: 10
  3.     month: 'May'
  4.       day: 'Tues'
复制代码

结果
回复此楼 已获打赏: 0 积分

举报

MATLAB 基础讨论
版块优秀回答者

入门

93 麦片

财富积分


50500


5

主题

288

帖子

17

最佳答案
  • 关注者: 1
发表于 2016-9-15 21:55:38 | 显示全部楼层
再送你一个,假定2016年1月1日为周一,这是2016年每天的星期表

  1. function m = year2016(a)
  2. B=[1,3,5,7,8,10,12];
  3. S=[4,6,9,11];
  4. L=2;
  5. Month = {'Jan','Feb','Mar','Apr','May','June','July','Aug','Sep','Oct','Nov','Dec'};
  6. Day   = {'Mon','Tues','Wed','Thu','Fri','Sat','Sun'};

  7. sumday = 0;

  8. for i = B(1:end)
  9.     sumDay = sumday + length(find(B<i)) * 31 + length(find(S<i)) * 30 + length(find(L<i)) * 29;
  10.     for j = 1:31
  11.         v{i}{j}.date = j;
  12.         v{i}{j}.month = Month{mod(i,13)};
  13.         day = mod(sumDay+j,7);
  14.         if(day == 0)
  15.             day = 7;
  16.         end
  17.         v{i}{j}.day   = Day{day};
  18.     end
  19. end
  20. for i = S(1:end)
  21.     sumDay = sumday + length(find(B<i)) * 31 + length(find(S<i)) * 30 + length(find(L<i)) * 29;
  22.     for j = 1 : 30
  23.         v{i}{j}.date = j;
  24.         v{i}{j}.month = Month(mod(i,13));
  25.         day = mod(sumDay+j,7);
  26.         if(day == 0)
  27.             day = 7;
  28.         end
  29.         v{i}{j}.day   = Day{day};
  30.     end
  31. end
  32. for i = L(1:end)
  33.     sumDay = sumday + length(find(B<i)) * 31 + length(find(S<i)) * 30 + length(find(L<i)) * 29;
  34.     for j = 1 : 29
  35.         v{i}{j}.date = j;
  36.         v{i}{j}.month = Month(mod(i,13));
  37.         day = mod(sumDay+j,7);
  38.         if(day == 0)
  39.             day = 7;
  40.         end
  41.         v{i}{j}.day   = Day{day};
  42.     end
  43. end
  44. m = v{a};
复制代码

另外,如果需要调整1月1日的星期项目,可以修改sumday = 0 为usumday = 1到7当中的某一天
回复此楼 已获打赏: 0 积分

举报

新手

6 麦片

财富积分


050


1

主题

6

帖子

0

最佳答案
 楼主| 发表于 2016-9-17 17:48:28 | 显示全部楼层

哇,真的非常感谢,没有及时看到,不好意思。
可能还有几个问题想请教:
1.我之前赋值时想用v(i).date(j)={j},这样得到v(1).date是一个1*31cell,这种赋值错误是因为我把v当成了struct?您用v(i)(j).date赋值, 将v设为一个cell,维度是i*j,然后每一项v(i)(j)都是一个struct?再分别给month,date,day赋值?
回复此楼 已获打赏: 0 积分

举报

新手

6 麦片

财富积分


050


1

主题

6

帖子

0

最佳答案
 楼主| 发表于 2016-9-17 18:02:15 | 显示全部楼层
killerzheng 发表于 2016-9-15 21:55
再送你一个,假定2016年1月1日为周一,这是2016年每天的星期表

另外,如果需要调整1月1日的星期项目,可以 ...

嗯嗯,非常感谢,第二个更贴近真实情况,我本来用的是很笨的办法,将12各月份按照一号分别为周一到周日分组,再来循环赋值。
但是,我还有一个问题就是,现在的情况是v为一个cell,调用函数的第二步“m(7)”,结果是一个1*1cell,得输入“m{7}”,才能得到结果。这里应该如何改进呢?是否应该将v设置为array?
回复此楼 已获打赏: 0 积分

举报

MATLAB 基础讨论
版块优秀回答者

入门

93 麦片

财富积分


50500


5

主题

288

帖子

17

最佳答案
  • 关注者: 1
发表于 2016-9-17 21:16:39 | 显示全部楼层 |此回复为最佳答案
小滴 发表于 2016-9-17 18:02
嗯嗯,非常感谢,第二个更贴近真实情况,我本来用的是很笨的办法,将12各月份按照一号分别为周一到周日分 ...


function m = year2016(a)

B=[1,3,5,7,8,10,12];
S=[4,6,9,11];
L=2;
Month = {'Jan','Feb','Mar','Apr','May','June','July','Aug','Sep','Oct','Nov','Dec'};
Day   = {'Mon','Tues','Wed','Thu','Fri','Sat','Sun'};

sumday = 0;

for i = B(1:end)
    sumDay = sumday + length(find(B<i)) * 31 + length(find(S<i)) * 30 + length(find(L<i)) * 29;
    for j = 1:31
        v(i,j).date = j;
        v(i,j).month = Month{mod(i,13)};
        day = mod(sumDay+j,7);
        if(day == 0)
            day = 7;
        end
        v(i,j).day   = Day{day};
    end
end
for i = S(1:end)
    sumDay = sumday + length(find(B<i)) * 31 + length(find(S<i)) * 30 + length(find(L<i)) * 29;
    for j = 1 : 30
        v(i,j).date = j;
        v(i,j).month = Month(mod(i,13));
        day = mod(sumDay+j,7);
        if(day == 0)
            day = 7;
        end
        v(i,j).day   = Day{day};
    end
end
for i = L(1:end)
    sumDay = sumday + length(find(B<i)) * 31 + length(find(S<i)) * 30 + length(find(L<i)) * 29;
    for j = 1 : 29
        v(i,j).date = j;
        v(i,j).month = Month(mod(i,13));
        day = mod(sumDay+j,7);
        if(day == 0)
            day = 7;
        end
        v(i,j).day   = Day{day};
    end
end
m = v(a,:);
回复此楼 已获打赏: 0 积分

举报

新手

6 麦片

财富积分


050


1

主题

6

帖子

0

最佳答案
 楼主| 发表于 2016-9-17 21:26:16 | 显示全部楼层
killerzheng 发表于 2016-9-17 21:16
function m = year2016(a)

B=[1,3,5,7,8,10,12];

谢谢,我也改过啦~稍微改了一下,比如第二第三循环的‘month’赋值应该是大括号{}。

  1. function m = year2016(a)
  2. B=[1,3,5,7,8,10,12];
  3. S=[4,6,9,11];
  4. L=[2];
  5. Month = {'January','February','March','April','May','June','July','August','Septmeber','October','November','December'};
  6. Day   = {'Fri','Sat','Sun','Mon','Tue','Wed','Thu'};

  7. sumday = 0;
  8. if a>=1&&a<=12
  9. for i = B(1:end)
  10.     sumDay = sumday + length(find(B<i)) * 31 + length(find(S<i)) * 30 + length(find(L<i)) * 29;
  11.     for j = 1:31
  12.         v(i,j).month = Month{mod(i,13)};
  13.         v(i,j).date = j;        
  14.         day = mod(sumDay+j,7);
  15.         if(day == 0)
  16.             day = 7;
  17.         end
  18.         v(i,j).day   = Day{day};
  19.     end
  20. end
  21. for i = S(1:end)
  22.     sumDay = sumday + length(find(B<i)) * 31 + length(find(S<i)) * 30 + length(find(L<i)) * 29;
  23.     for j = 1 : 30
  24.         v(i,j).month = Month{mod(i,13)};
  25.         v(i,j).date = j;
  26.         day = mod(sumDay+j,7);
  27.         if(day == 0)
  28.             day = 7;
  29.         end
  30.         v(i,j).day   = Day{day};
  31.     end
  32. end
  33. for i = L(1:end)
  34.     sumDay = sumday + length(find(B<i)) * 31 + length(find(S<i)) * 30 + length(find(L<i)) * 29;
  35.     for j = 1 : 29
  36.         v(i,j).month = Month{mod(i,13)};
  37.         v(i,j).date = j;
  38.         
  39.         day = mod(sumDay+j,7);
  40.         if(day == 0)
  41.             day = 7;
  42.         end
  43.         v(i,j).day   = Day{day};
  44.     end
  45. end
  46. m = v(a,:);
  47. else m =struct('month',[],'date',[],'day',[]);
  48. end
复制代码
回复此楼 已获打赏: 0 积分

举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

站长推荐上一条 /4 下一条

快速回复 返回顶部 返回列表