初步说明:我在朱莉娅工作,但这个问题可能适用于许多语言.
设置:我有一个复合类型如下:
type MyType
x::Vector{String}
end
Run Code Online (Sandbox Code Playgroud)
我写了一些方法来采取行动MyType.例如,我编写了一个允许我插入新元素的方法x,例如function insert!(d::MyType, itemToInsert::String).
问题:应该MyType是可变的还是一成不变的?
我的理解:我已经阅读了关于这个的Julia文档,以及关于Stackoverflow的更一般(和高度投票)的问题(例如这里或这里),但我仍然没有很好地处理它意味着什么从实际角度看可变/不可变(特别是对于不可变复合类型的情况,包含可变类型的可变数组!)
尽管如此,这是我的尝试:如果MyType是不可变的,那么这意味着该字段x必须始终指向同一个对象.该对象本身(字符串的向量)是可变的,因此我可以在其中插入新元素.我不允许做的是尝试改变,MyType以便该字段x指向一个完全不同的对象.例如,执行以下操作的方法是可以的:
MyType.x[1] = "NewValue"
push!(MyType.x, "NewElementToAdd")
Run Code Online (Sandbox Code Playgroud)
但是执行以下操作的方法并不合适:
MyType.x = ["a", "different", "string", "array"]
Run Code Online (Sandbox Code Playgroud)
这是正确的吗?另外,是否认为不可变类型字段值被锁定的对象是在构造函数中创建的对象?
最后一点:如果这似乎与SO上的其他问题重复,我道歉.如上所述,我已经仔细研究过,并且无法理解我所追求的.
使用Julia,我想可靠地将任何类型转换为类型String.似乎有两种方法可以在v0.5中进行转换,无论是string函数还是String构造函数.问题是您需要根据输入类型选择正确的一个.
例如,typeof(string(1))求值为String,但String(1)会引发错误.另一方面,typeof(string(SubString{String}("a")))求值为Substring{String},不是子类型String.我们需要这样做String(SubString{String}("a")).
所以似乎将任何输入转换x为类型的唯一可靠方法String是通过构造:
String(string(x))
Run Code Online (Sandbox Code Playgroud)
感觉有点麻烦.
我在这里错过了什么吗?
问题:在Matlab中,如何检查函数句柄是特定函数还是函数类型?
例如:我们f1是一个函数句柄.如何检查是否f1是内置的Matlab函数mean?如何检查是否f1是匿名函数?
我目前的解决方案:我目前解决此问题的方法是调用该functions函数.functions接受一个函数句柄作为输入,并返回一个包含输入函数句柄信息的结构,例如函数类型,路径,函数名等.它可以工作,但它不是一个理想的解决方案,因为,引用官方文档:
"注意事项MATLAB®仅提供functions用于查询和调试的功能.由于其行为可能会在后续版本中发生变化,因此您不应将其用于编程目的."
我想知道如何在Matlab中生成具有特定等级(枢轴列数)的nxn矩阵.我知道您可以使用该命令randi(IMAX, m, n)生成一个mxn矩阵,其中包含1到IMAX之间的随机条目,但是,例如,是否可以生成带有随机条目但只有2个透视列的4 x 4矩阵?提前致谢.
当我在Julia中定义一个数组时:
z = Array(Float64, 1)
Run Code Online (Sandbox Code Playgroud)
它似乎是一个随机值.有时它是0.0,但大多数情况下它是3.78692e-316.
这种行为是有意的吗?
如何用10个值初始化"常量"向量,例如b = [2.0 2 2 2]?
主要问题:将项目插入已使用Julia排序的列表的最快方法是什么?
目前,我这样做:
v = [1, 2, 3, 5] #example list
x = 4 #value to insert
index = searchsortedfirst(v, x) #find index at which to insert x
insert!(v, index, x) #insert x at index
Run Code Online (Sandbox Code Playgroud)
奖金问题:如果我想同时确保没有重复怎么办?
在Julia中,我可能想编写一个函数,0如果输入小于1,则返回,2如果输入大于或等于,则返回1.这是一个非常简单的函数,五行if else结构的冗长可能过多.所以我试图把它变成一个单行函数.我能想到的最好的是:
f(x::Number) = begin (x < 1) && return(0); return(2); end
Run Code Online (Sandbox Code Playgroud)
要么
f(x::Number) = begin x < 1 ? (y=0) : (y=2); return(y); end
Run Code Online (Sandbox Code Playgroud)
有没有更简单的方法来定义这个功能?
第二次更新:用户@Matt B确认为错误.请参阅下面的答案以获取更多详细信息.
更新: @waTeim已经证明可以编写和读取包含date类型列的DataFrame (在我的设置中确认).这很重要,因为这意味着Julia可以编写和读取数据框列中的某些复合类型.但是,类型日期时间(与类型日期不同)的情况仍然会引发错误,因此此时问题仍然没有答案.
在Julia中,使用HDF5和JLD包,可以使用以下方法在.jld文件中保存和加载DataFrame:
#Preamble
using HDF, JLD, DataFrames
filePath = "/home/colin/Test.jld";
#Save the data-frame
fid1 = jldopen(FP, "w");
write(fid1, "MyDataFrame", MyDataFrame);
close(fid1);
#Come back later and load the data-frame
fid1 = jldopen(FP, "r");
X = read(fid1, "MyDataFrame");
close(fid1);
Run Code Online (Sandbox Code Playgroud)
这很好用,只要数据框的列都是基本Julia类型的矢量,如Float64或Int64.但是,在实践中,我们通常希望数据框的第一列是a datetime,而不是基本类型(尽管可能在将来的版本中成为一个).在这种情况下,上面的代码对我的read操作失败,有一个很长的错误消息(如果有人在评论中提问,我会把它添加到底部).根据JLD包的文档,我在保存时尝试了以下操作:
#Save the data-frame
fid1 = jldopen(FP, "w");
addrequire(fid1, "/home/colin/.julia/v0.2/DataFrames/src/dataframe.jl")
addrequire(fid1, "/home/colin/.julia/v0.2/Datetime/src/Datetime.jl")
write(fid1, "MyDataFrame", MyDataFrame);
close(fid1);
Run Code Online (Sandbox Code Playgroud)
但这没有帮助.
我做了一些愚蠢的事情,或者这个功能根本不可用?
注意:包含HDF5标签,因为JLD包使用它.
我打开一些文件:
myfilepath = "/home/colin/somefile.csv"
fid = open(myfilepath, "r")
Run Code Online (Sandbox Code Playgroud)
我想从fid. 我可以用:
fid.name
Run Code Online (Sandbox Code Playgroud)
这将返回如下内容:
"<file /home/colin/somefile.csv>
Run Code Online (Sandbox Code Playgroud)
然而,据我所知,这并没有记录在案,所以我不能保证这个解决方案是面向未来的。
所以,我的问题是,是否有一种安全的方法可以IOStream从IOStream自身检索打开的文件路径?