我试图在同一个图上绘制几个核密度估计,我希望它们都是不同的颜色.我有一个使用字符串的kludged解决方案,'rgbcmyk'并为每个单独的绘图单步执行,但我在7次迭代后开始重复.是否有更简单/更有效的方法来实现这一目标,并提供更多颜色选项?
for n=1:10
source(n).data=normrnd(rand()*100,abs(rand()*50),100,1); %generate random data
end
cstring='rgbcmyk'; % color string
figure
hold on
for n=1:length(source)
[f,x]=ksdensity(source(n).data); % calculate the distribution
plot(x,f,cstring(mod(n,7)+1)) % plot with a different color each time
end
Run Code Online (Sandbox Code Playgroud) 我知道length(x)返回max(size(x))并numel(x)返回x的元素总数,但对于1乘n的数组哪个更好?它是否重要,或者在这种情况下它们是否可以互换?
编辑:只是为了踢:

看起来它们在性能方面是相同的,直到你获得100k元素.
我有一个空单元格数组和一些我想要转换为逻辑数组的单元格,其中空单元格为零.当我使用cell2mat时,空单元格被忽略,我最终得到一个只有1的矩阵,没有引用它们持有的先前索引.有没有办法在不使用循环的情况下执行此操作?
示例代码:
for n=1:5 %generate sample cell array
mycellarray{n}=1;
end
mycellarray{2}=[] %remove one value for testing
Run Code Online (Sandbox Code Playgroud)
我试过的事情:
mylogicalarray=logical(cell2mat(mycellarray));
Run Code Online (Sandbox Code Playgroud)
这导致[1,1,1,1],而不是[1,0,1,1,1].
for n=1:length(mycellarray)
if isempty(mycellarray{n})
mycellarray{n}=0;
end
end
mylogicalarray=logical(cell2mat(mycellarray));
Run Code Online (Sandbox Code Playgroud)
哪个有效,但使用循环.
我正在尝试使用'values'数组和'counter'数组将多个值插入到数组中.例如,如果:
a=[1,3,2,5]
b=[2,2,1,3]
Run Code Online (Sandbox Code Playgroud)
我想要一些功能的输出
c=somefunction(a,b)
Run Code Online (Sandbox Code Playgroud)
成为
c=[1,1,3,3,2,5,5,5]
Run Code Online (Sandbox Code Playgroud)
其中a(1)重复b(1)次,a(2)重复b(2)次等等...
MATLAB中是否有内置函数来执行此操作?如果可能的话,我想避免使用for循环.我尝试过'repmat()'和'kron()'的变体无济于事.
这基本上是Run-length encoding.
我在MATLAB中有一个GUI,预先放置了一组轴.我正在使用图例的位置属性将其放置在轴的右侧.但是,通过这样做,轴会重新缩放,以便轴+图例占据轴的原始宽度.有没有办法规避重新规模?
例:
x=0:.1:10;
y=sin(x);
figure
pos=get(gca,'position');
pos(3)=.5; %#re-size axes to leave room for legend
set(gca,'position',pos)
plot(x,y)
Run Code Online (Sandbox Code Playgroud)
到目前为止,我得到:

地方传奇:
legend('sin(x)','location','eastoutside')
Run Code Online (Sandbox Code Playgroud)
... ... aaaaand

MATLAB将它全部收入原始轴空间.有什么方法吗?
有没有办法将MATLAB错误消息保存到文件中?
这可能是一个简单的问题,但谷歌无法给我答案.我编译了一个GUI可执行文件,可以在没有MATLAB许可证的情况下使用,偶尔会冻结.出于审美目的,我通常附带这样的可执行文件来抑制命令窗口,因此我无法通过命令提示符输出错误消息.我希望能够创建一个错误日志,可以通过电子邮件发送给我进行调试.
谢谢!
有没有一种简单的方法可以从一组轴上移除绘制的线而不清除轴上的其他所有内容?我正在尝试使用包含多个数据集的列表框来实现GUI.我可以让回调函数绘制所选数据,但是当我取消选择数据集时,我不确定如何"取消删除"它.有任何想法吗?
我用bar3 plot命令生成了二维直方图(绘图是3D - 几个直方图并排绘制的直方图).但是,所有零值在xy平面中显示为平面正方形.有没有办法阻止MATLAB显示值?我已经尝试用NaN替换所有零,但它没有改变关于该情节的任何内容.这是我一直在试验的代码:
x1=normrnd(50,15,100,1); %generate random data to test code
x2=normrnd(40,13,100,1);
x3=normrnd(65,12,100,1);
low=min([x1;x2;x3]);
high=max([x1;x2;x3]);
y=linspace(low,high,(high-low)/4); %establish consistent bins for histogram
z1=hist(x1,y);
z2=hist(x2,y);
z3=hist(x3,y);
z=[z1;z2;z3]';
bar3(z)
Run Code Online (Sandbox Code Playgroud)
如您所见,图中有相当多的零值.用NaN替换零后关闭数字并重新绘图似乎没有任何改变:
close
z(z==0)=NaN;
bar3(z)
Run Code Online (Sandbox Code Playgroud) 我正在尝试在图例中为代码文本着色.(因为我试图将几个图表分成不同的类别,我不能仅仅依赖图例中的线条颜色.)我已经设法为整个图例设置文本颜色,但我无法设法逐行分配.这可能吗?
代码到目前为止:
list={'Label 1','Label 2','Label 3'};
leg=legend(list);
set(leg,'Textcolor',[1 0 0])
Run Code Online (Sandbox Code Playgroud)
将整个图例的文本颜色设置为红色.我希望能够制作一些红色和一些黑色.我尝试将颜色数组指定为nx 3矩阵,但MATLAB并不那么喜欢.我也使用了传奇属性get(leg),但我找不到其他任何看似有用的东西.有什么建议?
我编写了一个脚本,将其输出保存为CSV文件供以后参考,但导入数据的第二个脚本需要花费大量时间才能读回来.
数据采用以下格式:
Item1,val1,val2,val3
Item2,val4,val5,val6,val7
Item3,val8,val9
Run Code Online (Sandbox Code Playgroud)
标题位于最左侧列的位置,数据值占用行的其余部分.一个主要困难是数据值的数组对于每个测试项可以是不同的长度.我将它保存为结构,但我需要能够在MATLAB环境之外编辑它,因为有时我必须在没有安装MATLAB的计算机上删除坏数据行.所以,我的问题的第一部分是:我应该以不同的格式保存数据吗?
问题的第二部分:我尝试过importdata,csvread和dlmread,但我不确定哪个最好,或者是否有更好的解决方案.现在我正在使用我自己的脚本使用循环和fgetl,这对于大文件来说非常慢.有什么建议?
function [data,headers]=csvreader(filename); %V1_1
fid=fopen(filename,'r');
data={};
headers={};
count=1;
while 1
textline=fgetl(fid);
if ~ischar(textline), break, end
nextchar=textline(1);
idx=1;
while nextchar~=','
headers{count}(idx)=textline(1);
idx=idx+1;
textline(1)=[];
nextchar=textline(1);
end
textline(1)=[];
data{count}=str2num(textline);
count=count+1;
end
fclose(fid);
Run Code Online (Sandbox Code Playgroud)
(我知道这可能是非常复杂的代码 - 我是工程师,而不是程序员,请不要对我大喊大叫 - 但欢迎任何改进建议.)