小编Cau*_*ity的帖子

在Haskell中动态减少列表

假设我有一个f接受一些输入并产生数字的函数.在该函数内f,根据输入创建列表,然后减少(例如使用foldl' g)以产生最终输出数.因为毕竟要减少中间列表,是否可以应用reduce函数g 而不表示中间列表.这里的目标是限制用于存储(或表达,如果'存储'不太准确的单词)列表的存储器.

为了说明这个,这个函数foldPairProduct占用O(N1 * N2)了中间列表的空间(由于表达和惰性评估,消耗的空间可能更复杂,但我认为它是成比例的或更糟).以下N1, N2是两个输入列表的大小.

foldPairProduct :: (Num a, Ord a)  => (a -> a -> a) -> [a] -> [a] -> a
foldPairProduct f xs ys = foldl1 f [ x*y | x <- xs, y <- ys]
Run Code Online (Sandbox Code Playgroud)

逻辑的另一种实现是foldPairProduct',它占用O(2 * 2)空间.

foldPairProduct' :: Num a => (Maybe a -> Maybe a -> Maybe a) -> [a] -> [a] -> Maybe a …
Run Code Online (Sandbox Code Playgroud)

haskell list reduction on-the-fly

8
推荐指数
1
解决办法
2112
查看次数

Haskell中数据类型设计和使用的最佳实践

我的问题与Haskell程序设计的一般问题有关.但我想专注于一个特定的用例.

我定义了一种数据类型(例如Foo),并f通过模式匹配在函数(例如)中使用它.后来,我意识到type(Foo)需要一些额外的字段来支持新的功能.但是,添加字段会改变类型的使用方式; 即,可能会影响取决于类型的现有功能.在现有代码中添加新功能,但不具吸引力,很难避免.我想知道Haskell语言级别的最佳实践是什么,以尽量减少这种修改的影响.

例如,现有代码是:

data Foo = Foo {
  vv :: [Int]
}

f :: Foo -> Int
f (Foo v) = sum v
Run Code Online (Sandbox Code Playgroud)

f如果我添加另一个字段,该函数将是语法错误Foo:

data Foo = Foo {
  vv :: [Int]
  uu :: [Int]
}
Run Code Online (Sandbox Code Playgroud)

但是,如果我首先定义f了以下功能:

f :: Foo -> Int
f foo = sum $ vv foo
Run Code Online (Sandbox Code Playgroud)

,即使进行了修改Foo,f仍然是正确的.

haskell

8
推荐指数
2
解决办法
653
查看次数

在R中,跳出函数而不执行其余函数的关键字是什么?

我想知道在R中是否有任何关键字跳出函数而不执行其余的.在C,Java或Matlab中,有关键字'return'.但是R中的'return'关键字与那些语言中的'return'关键字不同.这是一个例子,

myfunc = function() {
  if (TRUE) {
      return # hopefully, jump out of the function
  }
  print('the rest of the function is still executed!')
}
Run Code Online (Sandbox Code Playgroud)

在这个例子中,"返回"时,遇到了像Java语言将不会执行"休息",而在R"回报"只是的范围是否仍执行的语句和功能的其余部分.在这个特定的例子中,我可以添加一个'else'块来实现它,但我想知道是否有任何关键字会产生与Java等相似的行为.谢谢.

r return function

7
推荐指数
1
解决办法
2433
查看次数

如何将变量转换为某些运行时类型从Scala中的TypeCast获取

asInstanceOf[T]"简单"案例的工作,其中类型T由代码明确给出:例如

scala> val x: Any = 5
x: Any = 5

scala> x.asInstanceOf[Int]
res50: Int = 5

scala> val m1: Any = Map[String, Int]("a"->1, "b"->2)
m1: Any = Map(a -> 1, b -> 2)

scala> m.asInstanceOf[Map[String, Int]]
res51: Map[String,Int] = Map(a -> 1, 2 -> b)

scala> val m2: Any = Map[Any,Any]("a"->1, 2->"b")
m2: Any = Map(a -> 1, 2 -> b)

scala> m.asInstanceOf[Map[Any, Any]]
res52: Map[Any,Any] = Map(a -> 1, 2 -> b)
Run Code Online (Sandbox Code Playgroud)

但是当T在运行时检索类型时 …

types casting scala

7
推荐指数
1
解决办法
3116
查看次数

如何使用Scipy.io.loadmat将Matlab mat文件中的字符串数组加载到Python列表或元组中

我是Python新手的Matlab用户.我想在Matlab中将一个字符串的单元格数组写入Mat文件,并使用Python(可能是scipy.io.loadmat)将这个Mat文件加载到某个类似的类型中(例如字符串列表或字符串元组).但是loadmat将东西读入数组,我不知道如何将其转换为列表.我尝试了"tolist"函数,它不能像我预期的那样工作(我对Python数组或numpy数组的理解不够).例如:

Matlab代码:

cell_of_strings = {'thank',  'you', 'very', 'much'};
save('my.mat', 'cell_of_strings');
Run Code Online (Sandbox Code Playgroud)

Python代码:

matdata=loadmat('my.mat', chars_as_strings=1, matlab_compatible=1);
array_of_strings = matdata['cell_of_strings']
Run Code Online (Sandbox Code Playgroud)

然后,变量array_of_strings是:

array([[[[u't' u'h' u'a' u'n' u'k']], [[u'y' u'o' u'u']],
    [[u'v' u'e' u'r' u'y']], [[u'm' u'u' u'c' u'h']]]], dtype=object)
Run Code Online (Sandbox Code Playgroud)

我不知道如何将这个array_of_strings转换为Python列表或元组,以便它看起来像

list_of_strings = ['thank',  'you', 'very', 'much'];
Run Code Online (Sandbox Code Playgroud)

我不熟悉Python或numpy中的数组对象.我们将非常感谢您的帮助.

python arrays string matlab mat-file

6
推荐指数
1
解决办法
5311
查看次数

如何使图像足够大以避免刻度标签重叠?

假设数据X的大小为1000*1000.使用以下命令显示X:

imagesc(X);
Run Code Online (Sandbox Code Playgroud)

并使用以下方式标记所有行:

set(gca, 'YTickLabel', somelabels);
Run Code Online (Sandbox Code Playgroud)

虽然数据X被正确地调整并且还显示了Ytick标签,但由于行数很多,标签高度重叠.有什么方法可以解决这个问题吗?任何帮助将受到高度赞赏.

编辑1

我意识到我的问题并不能很好地代表我的问题.我将根据答案结束我的理解并重新提出一个问题:

  1. 要在图窗口中显示尽可能多的行/标签,以下内容有助于:

    set(gca,'FontSize',6), 
    or, alternate the distance (suggested by yuk),
    or, set(gca,'YTick',1:10:1000,'YTickLabel',somelabels(1:10:1000));
    
    Run Code Online (Sandbox Code Playgroud)
  2. 代码

    set(gca,'Units','pixels','Position',[20 20 10000 10000]);
    
    Run Code Online (Sandbox Code Playgroud)

    默认情况下将显示放大的图像.但如果放大的图像太大而无法放入图窗口,则只会显示部分图像.但是,既不缩小也不平移工具可以到达该图像的其余部分.

  3. 代码的默认行为

    imagesc(X);
    set(gca, 'ytick', 1:1000, 'yticklabe', ylabel);
    
    Run Code Online (Sandbox Code Playgroud)

    显示适合图窗口的整个图像,并带有重叠标签.然而,它确实允许人们放大图像的一部分并看到未重叠的标签.

  4. 如果我将图像保存为pdf文件:

    imagesc(X);
    set(gca, 'ytick', 1:1000, 'yticklabe', ylabel);
    saveas(gcf, 'fig.pdf');
    
    Run Code Online (Sandbox Code Playgroud)

    然后保存的pdf只是适合图窗口的图像,带有重叠标签.然而,不同于放大 Matlab的数字窗口内,放大 PDF阅读器内不会改变标签的相对位置/距离.因此,pdf中的放大图像仍然是标签重叠的.

所以我的问题是:
如何将图像保存为pdf文件或png,以便在Adobe Reader中打开时具有与上述第3点类似的行为 ,而不是第4点的行为

matlab label overlapping

5
推荐指数
1
解决办法
3155
查看次数

在R中,匹配矩阵的行或列的函数

值匹配函数R是非常有用的.但根据我的理解,它不足以支持两个或高维输入.

例如,假设xy是相同数量的列的矩阵,我想匹配行的xy.'R'函数调用match(x,y)不会这样做.列表的输入也出现相同的不足.

我已经实现了我自己的版本调用matchMat(xMat, yMat)(附在下面),但我想知道你是什么解决了这个任务.

matchMat = function(xMat, uMat, dimn=1) {
    ind = rep(-1, dim(xMat)[dimn])
    id = 1 : dim(uMat)[dimn]
    for (i in id) {
        e = utilSubMat(i, uMat, dimn)
        isMatch = matchVect(e, xMat, dimn)
        ind[isMatch] = i
    }
    return(ind)
}

matchVect = function(v, xMat, dimn) {
    apply(xMat, dimn, function(e) {
        tf = e == v
        all(tf)
    })
}

unittest_matchMat = function() {
    dimn = …
Run Code Online (Sandbox Code Playgroud)

r

5
推荐指数
2
解决办法
2万
查看次数

haskell中的函数,像catMaybes,但有类型[也许一个] - >可能[a]

我想要一个类型的函数:

f :: [Maybe a] -> Maybe [a]
Run Code Online (Sandbox Code Playgroud)

例如

f [Just 3, Just 5] == Just [3, 5]
f [Just 3, Nothing] == Nothing
f [] == Just []
Run Code Online (Sandbox Code Playgroud)

这是一个类似catMaybes :: [Maybe a] -> [a]Data.Maybe,不同之处在于catMaybes忽略了Nothing,而我的f是关于十分严重Nothing.我可以f以一种天真的方式实现(如下所示),但想知道是否有更多的惯用方式(如"applicative functor"):

f :: [Maybe a] -> Maybe [a]
f xs = let ys = catMaybes xs
        in if length ys == length xs 
           then Just ys
           else Nothing
Run Code Online (Sandbox Code Playgroud)

要么

f :: …
Run Code Online (Sandbox Code Playgroud)

haskell functor applicative

5
推荐指数
2
解决办法
815
查看次数

设置Haskell的Data.Vector不提供的运算符,原因是什么

我的应用程序涉及大量数组操作(例如log(1)索引),因此Data.VectorData.Vector.UnboxedData.List受欢迎.它还涉及许多set操作(例如intersectBy),但是Data.Vector不提供这些操作.

这些函数中的每一个都可以像3-4行中的Data.List一样实现.有没有什么理由他们都没有用Data.Vector实现?我只能推测.由于性能原因,可能不建议在Data.Vector中设置操作,即intersectBy首先通过列表理解产生交集,然后将列表转换为Data.Vector?

haskell operations vector set

4
推荐指数
1
解决办法
375
查看次数

Haskell设计了与类似功能集相关联的多个模块的最佳实践

说出功能foo,bar noo是我程序中的基础知识.此外,这些功能可以在不同的不同的方式来实现的场景(foo1, bar1, foo2, bar2等),虽然foo1foo2仍然具有相同的输入和输出类型.根据一些输入或配置,程序foo1, bar1在某些情况下使用,而在另一种情况下,foo2, bar2.

我可以如上所述定义它们,附加后缀(1,2,3 ..)foo, bar, noo.然而,这并不漂亮,因为后缀可能很长; 它也不允许foo1bar1(vs. bar2)特殊绑定.

另一种方法是将每个方案视为一个单独的方案Module.现在foo, bar, noo每个案例很好地结合在一起,避免了丑陋的后缀.但是,当每个文件有一个文件时,会引入许多文件Module.这种方法的另一个缺点是,Modules即使它们确实具有一些相似性(例如三个函数),它们也是完全分开的.

一个typeclass解决方案将被欣赏,但没有想到,因为foo不同场景的不同具有相同的输入和输出.

我想知道是否有任何Haskell问题的最佳实践,以避免上述这些方法的缺点.

foo1 :: Double -> Double
bar1 :: Int -> Int
noo1 :: [Int] -> [Int]

foo2 :: …
Run Code Online (Sandbox Code Playgroud)

java haskell design-patterns interface typeclass

4
推荐指数
1
解决办法
192
查看次数